GNU/Linux >> Belajar Linux >  >> Linux

CronJob tidak berjalan

WTF?! Cronjob saya tidak berjalan?!

Berikut adalah panduan checklist untuk men-debug cronjobs yang tidak berjalan:

  1. Apakah daemon Cron berjalan?
  • Jalankan ps ax | grep cron dan cari cron.
  • Debian:service cron start atau service cron restart
  1. Apakah cron berfungsi?
  • * * * * * /bin/echo "cron works" >> /tmp/file
  • Sintaks benar? Lihat di bawah.
  • Anda jelas perlu memiliki akses tulis ke file yang Anda alihkan hasilnya. Nama file unik di /tmp yang saat ini tidak ada harus selalu dapat ditulis.
  • Mungkin juga menambahkan 2>&1 untuk memasukkan kesalahan standar serta keluaran standar, atau mengeluarkan kesalahan standar secara terpisah ke file lain dengan 2>>/tmp/errors
  1. Apakah perintah bekerja mandiri?
  • Periksa apakah skrip memiliki kesalahan, dengan melakukan uji coba pada CLI
  • Saat menguji perintah Anda, uji sebagai pengguna yang crontabnya sedang Anda edit, yang mungkin bukan login atau root Anda
  1. Bisakah cron menjalankan pekerjaan Anda?
  • Periksa /var/log/cron.log atau /var/log/messages untuk kesalahan.
  • Ubuntu:grep CRON /var/log/syslog
  • Redhat:/var/log/cron
  1. Periksa izin
  • Atur flag yang dapat dieksekusi pada perintah:chmod +x /var/www/app/cron/do-stuff.php
  • Jika Anda mengalihkan keluaran perintah ke file, pastikan Anda memiliki izin untuk menulis ke file/direktori tersebut
  1. Periksa jalur
  • Periksa baris she-bangs / hashbangs
  • Jangan mengandalkan variabel lingkungan seperti PATH , karena nilainya kemungkinan tidak akan sama di bawah cron seperti di sesi interaktif. Lihat Cara membuat CRON memanggil PATH yang benar
  1. Jangan menekan keluaran saat melakukan debug
  • Yang umum digunakan adalah supresi ini:30 1 * * * command > /dev/null 2>&1
  • Aktifkan kembali keluaran standar atau keluaran pesan kesalahan standar dengan menghapus >/dev/null 2>&1 sama sekali; atau mungkin mengalihkan ke file di lokasi di mana Anda memiliki akses tulis:>>cron.out 2>&1 akan menambahkan keluaran standar dan kesalahan standar ke cron.out di direktori home pengguna yang memohon.
  • Jika Anda tidak mengalihkan output dari cron pekerjaan, daemon akan mencoba mengirimi Anda keluaran atau pesan kesalahan apa pun melalui email. Periksa kotak masuk Anda (mungkin hanya more $MAIL jika Anda tidak memiliki klien email). Jika email tidak tersedia, mungkin periksa file bernama dead.letter di direktori home Anda, atau entri log sistem yang mengatakan bahwa output telah dibuang. Terutama dalam kasus terakhir, mungkin mengedit tugas untuk menambahkan pengalihan ke file, lalu menunggu tugas berjalan, dan memeriksa file log untuk melihat pesan kesalahan atau umpan balik berguna lainnya.
  • Jika Anda mencoba mencari tahu mengapa sesuatu gagal, pesan kesalahan akan terlihat di file ini. Baca dan pahami.

Masih belum berfungsi? Astaga!

  1. Naikkan level debug cron
  • Debian
    • di /etc/default/cron
    • setel EXTRA_OPTS="-L 2"
    • service cron restart
    • tail -f /var/log/syslog untuk melihat skrip dijalankan
  • Ubuntu
    • di /etc/rsyslog.d/50-default.conf
    • tambahkan atau komentari baris cron.* /var/log/cron.log
    • muat ulang pencatat sudo /etc/init.d/rsyslog restart
    • jalankan kembali cron
    • buka /var/log/cron.log dan cari keluaran kesalahan mendetail
  • Pengingat:nonaktifkan level log, saat Anda selesai melakukan debug
  1. Jalankan cron dan periksa lagi file log

Sintaks Cronjob

# Minute  Hour  Day of Month      Month         Day of Week    User Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  
         
    0       2       *             *                *          root /usr/bin/find

Sintaks ini hanya benar untuk root pengguna. Pengguna biasa crontab sintaks tidak memiliki Pengguna bidang (pengguna biasa tidak diizinkan menjalankan kode seperti pengguna lainnya);

# Minute  Hour  Day of Month      Month         Day of Week    Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  
         
    0       2       *             *                *          /usr/bin/find

Perintah Crontab

  1. crontab -l
    • Mencantumkan semua tugas cron pengguna.
  2. crontab -e , untuk pengguna tertentu:crontab -e -u agentsmith
    • Memulai sesi edit file crontab Anda.
    • Saat Anda keluar dari editor, crontab yang dimodifikasi akan diinstal secara otomatis.
  3. crontab -r
    • Menghapus entri crontab Anda dari spooler cron, tetapi bukan dari file crontab.

Saya ingin menambahkan 2 poin yang saya pelajari:

  1. Berkas konfigurasi cron yang dimasukkan ke dalam /etc/cron.d/ tidak boleh berisi titik (.). Jika tidak, itu tidak akan dibaca oleh cron.
  2. Jika pengguna yang menjalankan perintah Anda tidak ada di /etc/shadow. Itu tidak akan diizinkan untuk menjadwalkan cron.

Referensi:

  1. http://manpages.ubuntu.com/manpages/xenial/en/man8/cron.8.html
  2. https://help.ubuntu.com/community/CronHowto

Akhirnya saya menemukan solusinya. Berikut solusinya:-

  1. Jangan pernah menggunakan jalur relatif dalam skrip python untuk dieksekusi melalui crontab. Saya malah melakukan hal seperti ini:-

    import os
    import sys
    import time, datetime
    
    CLASS_PATH = '/srv/www/live/mainapp/classes'
    SETTINGS_PATH = '/srv/www/live/foodtrade'
    sys.path.insert(0, CLASS_PATH)
    sys.path.insert(1,SETTINGS_PATH)
    
    import other_py_files
    
  2. Jangan pernah menekan kode crontab alih-alih gunakan server surat dan periksa surat untuk pengguna. Itu memberikan wawasan yang lebih jelas tentang apa yang sedang terjadi.


Alasan lain crontab akan gagal:Penanganan khusus % karakter.

Dari file manual:

The entire command portion of the line, up to a newline or a
"%" character, will be executed by /bin/sh or by the shell specified
in the SHELL variable of the cronfile.  A "%" character in the
command, unless escaped with a backslash (\), will be changed into
newline characters, and all data after the first % will be sent to
the command as standard input.

Dalam kasus khusus saya, saya menggunakan date --date="7 days ago" "+%Y-%m-%d" untuk menghasilkan parameter pada skrip saya, dan gagal secara diam-diam. Saya akhirnya menemukan apa yang terjadi ketika saya memeriksa syslog dan melihat perintah saya terpotong di % simbol. Anda harus menghindarinya seperti ini:

date --date="7 days ago" "+\%Y-\%m-\%d"

Lihat di sini untuk detail selengkapnya:

http://www.ducea.com/2008/11/12/using-the-character-in-crontab-entries/


Linux
  1. Cara menggunakan cron di Linux

  2. .bash_profile Tidak Bersumber Saat Menjalankan Su?

  3. Vim Tidak Berjalan Di Dalam Tmux?

  1. Pengaturan pekerjaan cron Godaddy untuk menjalankan skrip php

  2. Menjalankan tugas cron di Linux setiap enam jam

  3. Perintah Linux untuk memeriksa apakah skrip shell sedang berjalan atau tidak

  1. @reboot tidak berfungsi di CRON

  2. Kode python untuk memeriksa apakah layanan sedang berjalan atau tidak.?

  3. pasang Linux NFS. rpc.statd tidak berjalan