Saya biasanya memiliki beberapa masalah dengan bagaimana cron mengeksekusi skrip karena mereka biasanya tidak memiliki pengaturan lingkungan saya. Apakah ada cara untuk memanggil bash (?) Dengan cara yang sama dengan cron sehingga saya bisa menguji skrip sebelum menginstalnya?
253
Jawaban:
Tambahkan ini ke crontab Anda (sementara):
Setelah berjalan, lakukan ini:
Ini mengasumsikan bahwa cron Anda menjalankan / bin / sh, yang merupakan default terlepas dari shell default pengguna.
sumber
env -
cat ~ / cronenv` / bin / sh` harus ditulis sebagai cron job juga? tolong beri contohCron hanya menyediakan lingkungan ini secara default:
HOME
direktori home penggunaLOGNAME
login penggunaPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
Jika Anda membutuhkan lebih banyak, Anda dapat sumber skrip di mana Anda mendefinisikan lingkungan Anda sebelum tabel penjadwalan di crontab.
sumber
.
biasanya bukan bagian dariPATH
lagi, untuk alasan keamanan .Beberapa pendekatan:
Ekspor cron env dan sumberkan:
Menambahkan
ke crontab Anda, biarkan berjalan sekali, matikan kembali, lalu jalankan
Dan Anda sekarang berada di dalam
sh
sesi yang memiliki lingkungan cronBawa lingkungan Anda ke cron
Anda dapat melewati latihan di atas dan hanya melakukan
. ~/.profile
di depan pekerjaan cron Anda, misalnyaGunakan layar
Dua solusi di atas masih gagal karena mereka menyediakan lingkungan yang terhubung ke sesi X yang sedang berjalan, dengan akses ke
dbus
dll. Misalnya, di Ubuntu,nmcli
(Network Manager) akan bekerja di dua pendekatan di atas, tetapi masih gagal di cron.Tambahkan baris di atas ke cron, biarkan berjalan sekali, matikan kembali. Hubungkan ke sesi layar Anda (layar -r). Jika Anda memeriksa sesi layar telah dibuat (dengan
ps
) sadar bahwa mereka kadang-kadang menggunakan huruf besar (misalnyaps | grep SCREEN
)Sekarang genap
nmcli
dan yang serupa akan gagal.sumber
Anda dapat menjalankan:
Ini akan menjalankan perintah_Anda dengan lingkungan kosong.
sumber
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command arguments
yang tampaknya melakukan trikTergantung pada cangkang akun
atau
Dari http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
sumber
Menjawab enam tahun kemudian: masalah ketidakcocokan lingkungan adalah salah satu masalah yang diselesaikan oleh
systemd
"timer" sebagai pengganti cron. Apakah Anda menjalankan systemd "layanan" dari CLI atau melalui cron, ia menerima lingkungan yang persis sama, menghindari masalah ketidakcocokan lingkungan.Masalah paling umum yang menyebabkan pekerjaan cron gagal ketika mereka lulus secara manual adalah pembatasan standar yang
$PATH
ditetapkan oleh cron, yang ini pada Ubuntu 16.04:Sebaliknya, default
$PATH
set olehsystemd
pada Ubuntu 16.04 adalah:Jadi sudah ada peluang yang lebih baik bahwa timer systemd akan menemukan biner tanpa kerumitan lebih lanjut.
The downside dengan timer systemd, adalah ada sedikit lebih banyak waktu untuk mengaturnya. Anda pertama-tama membuat file "service" untuk menentukan apa yang ingin Anda jalankan dan file "timer" untuk menentukan jadwal untuk menjalankannya dan akhirnya "mengaktifkan" timer untuk mengaktifkannya.
sumber
Buat pekerjaan cron yang menjalankan env dan mengarahkan ulang stdout ke file. Gunakan file di samping "env -" untuk menciptakan lingkungan yang sama dengan pekerjaan cron.
sumber
Jangan lupa bahwa karena cron's parent init, ia menjalankan program tanpa terminal pengendali. Anda dapat mensimulasikannya dengan alat seperti ini:
http://libslack.org/daemon/
sumber
Secara default,
cron
jalankan pekerjaannya menggunakan apa pun ide sistem Andash
. Ini bisa menjadi aktual Bourne shell ataudash
,ash
,ksh
ataubash
(atau yang lain) symlinked kesh
(dan sebagai hasilnya berjalan dalam mode POSIX).Hal terbaik untuk dilakukan adalah memastikan skrip Anda memiliki apa yang mereka butuhkan dan menganggap tidak ada yang disediakan untuk mereka. Oleh karena itu, Anda harus menggunakan spesifikasi direktori lengkap dan mengatur variabel lingkungan seperti
$PATH
Anda.sumber
0 0 * * 1 /path/to/executable >/dev/null 2>&1
dan kemudian, dalam "executable" saya akan menetapkan nilai untuk$PATH
, dll., Dan menggunakan spesifikasi direktori lengkap untuk menginput dan output file, dll. Sebagai contoh:/path/to/do_something /another/path/input_file /another/path/to/output_file
Cara sederhana lain yang saya temukan (tetapi mungkin rentan kesalahan, saya masih menguji) adalah untuk mencari file profil pengguna Anda sebelum perintah Anda.
Mengedit skrip /etc/cron.d/:
Akan berubah menjadi:
Kotor, tapi itu menyelesaikan pekerjaan untukku. Apakah ada cara untuk mensimulasikan login? Hanya perintah yang bisa Anda jalankan?
bash --login
tidak bekerja Sepertinya itu akan menjadi cara yang lebih baik.EDIT: Ini tampaknya menjadi solusi yang solid: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
sumber
Jawaban yang diterima memang memberikan cara untuk menjalankan skrip dengan lingkungan yang akan digunakan cron. Seperti yang ditunjukkan orang lain, ini bukan satu-satunya kriteria yang dibutuhkan untuk debugging pekerjaan cron.
Memang, cron juga menggunakan terminal non-interaktif, tanpa input yang terpasang, dll.
Jika itu membantu, saya telah menulis skrip yang memungkinkan tanpa kesulitan menjalankan perintah / skrip karena akan dijalankan oleh cron. Meminta dengan perintah / skrip Anda sebagai argumen pertama dan Anda baik.
Skrip ini juga dihosting (dan mungkin diperbarui) di Github .
sumber
Jawaban https://stackoverflow.com/a/2546509/5593430 menunjukkan cara mendapatkan lingkungan cron dan menggunakannya untuk skrip Anda. Namun ketahuilah bahwa lingkungan dapat berbeda tergantung pada file crontab yang Anda gunakan. Saya membuat tiga entri cron berbeda untuk menyelamatkan lingkungan melalui
env > log
. Ini adalah hasil di Amazon Linux 4.4.35-33.55.amzn1.x86_64.1. Global / etc / crontab dengan pengguna root
2. crontab pengguna root (
crontab -e
)3. Script di /etc/cron.hourly/
Yang terpenting
PATH
,PWD
danHOME
berbeda. Pastikan untuk mengatur ini dalam skrip cron Anda untuk bergantung pada lingkungan yang stabil.sumber
Saya tidak percaya ada; satu-satunya cara saya tahu untuk menguji pekerjaan cron adalah mengaturnya untuk menjalankan satu atau dua menit di masa depan dan kemudian menunggu.
sumber