Bagaimana Anda mengatur variabel DATE untuk digunakan dalam log untuk keluaran crontab?

10

Saya sedang bermain aroudn dengan beberapa variasi tanggal seperti

DATE = $(date)

tapi itu tidak berhasil

crontab -e

CRONLOG=/tmp/log/crontab.log
DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
* * * * * echo $DATEVAR >> /tmp/log/crontab.log
*/2 * * * * echo "$DATEVAR hello" >> ${CRONLOG}
*/1 * * * * echo 'every minute' >> ${CRONLOG}

ini hanya menampilkan teks seperti ...

Saya ingin membuat entri log di crontab.log dengan stempel waktu di setiap pembaruan

Bagaimana saya bisa melakukan ini pada CentOS 6?

MEMPERBARUI

DATEVAR=date +20%y%m%d_%H%M%S
*/1 * * * * /bin/echo [CRON] $($(DATEVAR)) >> /tmp/log/crontab.log

diberikan hanya [CRON] dan TIDAK ADA ketika saya mencobanya = /

qodeninja
sumber

Jawaban:

28

Cron bukan shell - ia tidak menguraikan perintah dengan cara yang sama seperti shell. Dengan demikian, variabel Anda ditetapkan seolah-olah itu adalah teks statis.

Ada tiga solusi yang saya tahu tentang masalah ini:

Opsi 1: Gunakan skrip shell untuk menghasilkan perintah Anda, sertakan variabel dan logika apa pun yang Anda inginkan - dan panggil skrip shell itu dari cron.

* * * * * /path/to/myscript.sh

myscript.sh:

DATEVAR=`date +20\%y\%m\%d_\%H\%M\%S`
echo $DATEVAR >> /tmp/crontab.log

Opsi 2: Sertakan perintah tanggal langsung di perintah Anda, dan, karena seluruh perintah dilewatkan ke shell, tanggal akan diproses dan diganti dengan tanggal yang sebenarnya.

* * * * * /bin/echo `date +20\%y\%m\%d_\%H\%M\%S` >> /tmp/crontab.log

Opsi 3: Setel variabel string dalam cron, dan berikan itu ke perintah Anda untuk diproses (perhatikan - tanda persen tidak perlu diloloskan, dan variabel itu sendiri dibungkus dalam $ () untuk menjalankannya dalam shell yang terpisah - backticks harus bekerja sama):

DATEVAR=date +20%y%m%d_%H%M%S
* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

(Dalam semua kasus di atas, Anda tentu saja dapat menggunakan variabel untuk jalur log, alih-alih 'mengkodekan' itu.)

cyberx86
sumber
1
terima kasih atas umpan balik yang luar biasa +1, saya mencoba menambahkannya ke crontab tetapi melakukan itu tidak berhasil = / tidak pernah merender DATEVAR
qodeninja
Saya baru saja melakukan ini pada sistem yang kompatibel RHEL / CentOS6 dan memberikan hasil yang diharapkan (yaitu menambahkan baris baru ke file dengan tanggal). Opsi mana (dari 3 di atas) yang Anda coba, dan apa hasilnya - spesifik - dan apakah ada kesalahan di / var / log / cron? (jika Anda menggunakan opsi skrip, a) jangan lupa chmod + x dan b) coba sendiri terlebih dahulu (yaitu tidak melalui cron))
cyberx86
1
opsi 3 =], saya telah mencoba melakukan itu sebelumnya tetapi tidak dapat ditampilkan. Tapi sekarang saya perhatikan Anda melakukan sesuatu yang berbeda. mengapa Anda menggandakan $ ($ (DATE))? lihat pembaruan saya di atas
qodeninja
1
Anda memiliki kesalahan ketik pada pembaruan yang Anda tambahkan - $($DATEVAR)tidak sama sekali $($(DATEVAR)). Pikirkan seperti ini $()- yaitu, braket luar - meluncurkan shell baru untuk memproses apa pun yang ada dalam kurung. Dalam kasus ini, variabel $ DATEVAR diatur ke string dan diteruskan ke shell. $(DATEVAR)tidak ada - karena DATEVARtidak ada apa-apanya (yaitu tidak ada $ untuk mengidentifikasinya sebagai variabel). Anda juga dapat menggunakan backticks $DATEVARuntuk mendapatkan hasil yang sama
cyberx86
cukup adil. memperbaruinya. ayo coba bocah nakal ini! - Hazaaah! itu berhasil lol
qodeninja