Saya mencoba mengatur pekerjaan root cron untuk menjalankan skrip Bash sebagai root, untuk dijalankan pada menit 7,37, setiap jam, setiap hari dalam sebulan, setiap bulan. Script ini terletak di /usr/bin
dan dinamai tunlrupdate.sh
. Ini memperbarui DNS dari Tunlr.
$ ls -l /usr/bin/tunlrupdate.sh
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh
Skrip Bash ini tersedia di sini .
Ketika dipanggil, skrip menulis apa yang terjadi di log yang berlokasi di /var/log/tunlr.log
Untuk menambahkan pekerjaan root cron ini, saya menggunakan standar untuk crontab root
sudo crontab -e
Dan memasukkan 2 baris ini di akhir. Saya berharap cron menjalankan skrip sebagai root.
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh
Perintah selanjutnya sudo crontab -l
mengkonfirmasi bahwa tugas cron telah dimasukkan.
Saya melakukan reboot Ubuntu dan sedang memeriksa file log jika pekerjaan cron diluncurkan dengan benar. Namun tidak ada dalam logfile yang /var/log/tunlr.log
berarti pekerjaan itu tidak pernah berhasil diluncurkan.
Saya memeriksa apakah saya menjalankan skrip dari baris perintah
sudo /usr/bin/tunlrupdate.sh
kemudian file log diperbarui sesuai.
Mengapa pekerjaan cron ini tidak berjalan sesuai rencana di sistem saya?
PEMBARUAN 1: Semua solusi yang diusulkan sejauh ini tidak berhasil. Saya berterima kasih kepada Olli untuk CLI untuk daftar log sistem sudo grep CRON /var/log/syslog
. Namun saya memang mendapatkan kesalahan CRON
CRON[13092]: (root) CMD ( [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)
dengan PATH yang disarankan = penyisipan & penggunaan jalur absolut dari root untuk fungsi-fungsi dalam skrip atau tanpa solusi yang disarankan di sini. Saya masih mendapatkan kesalahan ini.
Setelah beberapa pencarian saya menemukan kesalahan dalam file /usr/lib/php5/maxlifetime
seperti yang dijelaskan di sini :Change #!/bin/sh -e --> #!/bin/sh -x
Kemudian daftar kesalahan log CRON di sistem saya
sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)
Saya masih belum mendapatkan eksekusi bash script. Kali ini tidak ada kesalahan yang ditampilkan di log. Untuk mendapatkan jaminan ini bukan isi skrip saya mengurangi skrip menjadi 3 baris berikut:
#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE
Saya masih belum bisa menyelesaikan pekerjaan cron. Tidak ada yang tertulis dalam file log. Jadi, bahkan mungkin skrip kosong tidak akan berjalan di cron? Saya tidak mengerti. Saya tahu mencoba skrip direduksi menjadi 2 baris ini:
#!/bin/bash
exit 0
Dan masih log kesalahan yang sama. Script cron tidak melewati ...
Jawaban:
Jika Anda ingin menjalankan skrip sebagai pengguna biasa :
Dan tambahkan baris:
Jika Anda ingin menjalankan skrip Anda sebagai root :
Dan tambahkan baris yang sama:
sumber
sudo crontab -e
bukancrontab -e
). Atau sesuatu yang lain, tetap berfungsiNah, akhirnya solusi yang berhasil. Di syslog saya melihat yang berulang dan menarik:
Kedengarannya seperti root tidak dikenali sebagai cmd. Karena saya sudah menggunakan cron root dengan menggunakan
$ sudo /usr/bin/tunlrupdate.sh
. Kemudian saya mencoba dengan skrip asli (dikoreksi karena kesalahan pada tanggal UNIX cmd:% m yang merupakan bulan digunakan untuk menit yaitu% M) berikut ini (yang menghilangkan root dari baris cron):Ini ternyata menjadi solusi terakhir. [Meskipun saya menemukan banyak literatur yang menyatakan garis yang salah dengan root pada baris cron. Itu adalah sebuah kesalahan].
sumber
crontab
perintah (kecuali file crontab di bawah/etc
)./etc/crontab
(crontab seluruh sistem). Menggunakansudo crontab -e
Anda sedang bekerja dengan crontab root yang biasanya dapat ditemukan di/var/spool/cron/crontabs
Satu "masalah" dengan cron adalah kurangnya variabel lingkungan (untuk alasan keamanan yang jelas ). Anda mungkin melewatkan PATH dan HOME. Anda dapat mendefinisikannya dalam skrip secara langsung atau dalam file crontab.
Anda harus menguji sampai semua variabel yang diperlukan didefinisikan sebagaimana diminta oleh skrip.
sumber
/etc/crontab
file dan menempelkannya ke dalamsudo crontab -e
dan perintah dijalankan sebagai root tanpa masalah. Terima kasih!Pesan kesalahan Cron biasanya - secara default - dikirim melalui email. Anda dapat memeriksa apakah ada email untuk root
sudo mail
, atau dengan hanya memeriksa konten/var/mail/root
, misalnyasudo less /var/mail/root
.Jika pesan email tidak membantu, periksa juga
/var/log/syslog
:Seperti yang dikatakan Alexis Wilke, cron memiliki mekanisme berbeda untuk mengatur variabel lingkungan.
Kebutuhan skrip Anda
ke crontab.
HOME
seharusnya tidak perlu. Anda harus menggunakan jalur absolut dalam skrip Anda, misalnya/bin/date
alih-alihdate
. Anda dapat menemukan jalur yang tepat untuk setiap perintahwhich command_name
, misalnyasumber
/var/mail/root
. Anda dapat memperbaikinya, atau cobaPATH=...
Anda dapat menambahkan baris ini dalam skrip Anda. Jadi setelah Anda memeriksa log cron dan menyetujui pekerjaan Anda dieksekusi, Anda bisa mendapatkan $ PATH dari crontab yang sama.
Dan mungkin hal terbaik yang dapat Anda lakukan untuk mendiagnosis masalah dalam skrip cron adalah mendapatkan semua variabel lingkungan SO dengan perintah env di skrip Anda. Jadi tambahkan saja baris ini ke skrip Anda. Kemudian Anda bisa menganalisis hasilnya
allEvnVars.txt
Trik lain adalah mengarahkan output skrip ke suatu tempat. Menambahkan
/root/log.log
. Dengan cara ini semua output dari skrip akan dipertahankan/root/log.log
Anda juga dapat menjadwalkan skrip untuk menjalankan setiap menit untuk memfasilitasi tes dan pemeriksaan.
sumber