(Saya sudah membaca Bagaimana saya bisa menguji skrip cron baru? )
Saya memiliki masalah khusus (pekerjaan cron tampaknya tidak berjalan, atau berjalan dengan benar), tetapi masalah ini bersifat umum: Saya ingin men-debug skrip yang disinkronkan. Saya sadar bahwa saya dapat mengatur baris * * * * * crontab, tetapi itu bukan solusi yang sepenuhnya memuaskan. Saya ingin dapat menjalankan pekerjaan cron dari baris perintah seolah-olah cron menjalankannya (pengguna yang sama, variabel lingkungan yang sama, dll.). Apakah ada cara untuk melakukan ini? Harus menunggu 60 detik untuk menguji perubahan skrip tidak praktis.
Jawaban:
Inilah yang saya lakukan, dan sepertinya berhasil dalam situasi ini. Setidaknya, ini menunjukkan saya kesalahan, sedangkan berjalan dari baris perintah karena pengguna tidak menunjukkan kesalahan.
Langkah 1 : Saya meletakkan baris ini sementara di crontab pengguna:
kemudian mengeluarkannya begitu file itu ditulis.
Langkah 2 : Buat sendiri skrip bash run-as-cron kecil yang berisi:
Jadi, sebagai pengguna yang dimaksud, saya bisa
Solusi ini jelas dapat diperluas untuk memanfaatkan sudo atau semacamnya agar lebih fleksibel.
Semoga ini bisa membantu orang lain.
sumber
/usr/bin
. 2)cat …/cron-env
Output beberapa baris, yang tidak berfungsi. Coba saja jalankan/usr/bin/env -i $(cat cron-env) echo $PATH
di terminal, ini menghasilkan lingkungan secara harfiah daripada menggunakannya. 3) Lingkungan saat ini bocor ke dalam lingkungan cron yang ditiru. Cobalah:export foo=leaked; run-as-cron echo $foo
.cat
output beberapa baris, yang berfungsi, karena penggantian shell runtuh menjadi satu baris, yang dapat Anda periksa denganecho $(cat cron-env ) | wc
; contoh perintah Anda/usr/bin/env -i $(cat cron-env) echo $PATH
,, pengganti$PATH
dari shell panggilan; sebagai gantinya, harus meminta subkulit untuk menggantikan dalam sub-lingkungan, misalnya/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Anda telah melakukan kesalahan yang sama, lagi-lagi mengganti kulit panggilan alih-alih di lingkunganSaya menyajikan solusi berdasarkan jawaban Pistos, tetapi tanpa cacat.
Tambahkan baris berikut ke crontab, misalnya menggunakan
crontab -e
Buat skrip shell yang menjalankan perintah di lingkungan yang sama dengan cron jobs dijalankan:
Menggunakan:
misalnya
Perhatikan bahwa argumen kedua perlu dikutip jika memerlukan argumen. Baris pertama skrip memuat shell POSIX sebagai juru bahasa. Baris kedua sumber file lingkungan cron. Ini diperlukan untuk memuat shell yang benar, yang disimpan dalam variabel lingkungan
SHELL
. Kemudian memuat lingkungan kosong (untuk mencegah bocornya variabel lingkungan ke dalam shell baru), meluncurkan shell yang sama yang digunakan untuk cronjobs dan memuat variabel lingkungan cron. Akhirnya perintah dieksekusi.sumber
Karena crontab tidak melakukan pekerjaannya, Anda akan memanipulasi kontennya:
Apa fungsinya:
sumber
sudo -H -u otheruser bash -c 'crontab..."
menjalankan crontab pengguna lain btwSecara default dengan sebagian besar daemon cron default yang saya lihat, tidak ada cara untuk memberitahu cron untuk berjalan di sini sekarang. Jika Anda menggunakan anacron, mungkin saya pikir menjalankan contoh terpisah di latar depan.
Jika skrip Anda tidak berjalan dengan benar maka Anda tidak memperhitungkannya
Dari crontab (5):
Secara umum PATH adalah masalah terbesar, jadi Anda perlu:
Jika Anda perlu menjalankan skrip sebagai pengguna lain tanpa shell (mis. Www-data), gunakan sudo:
Hal pertama yang harus diuji sebelum semua itu, tentu saja, adalah skrip Anda benar-benar melakukan apa yang seharusnya dilakukan dari baris perintah. Jika Anda tidak dapat menjalankannya dari baris perintah, itu jelas tidak akan bekerja dengan cron.
sumber
Naskah Marco tidak bekerja untuk saya karena suatu alasan. Saya tidak punya waktu untuk debug, jadi saya menulis skrip Python yang melakukan hal yang sama. Itu lebih lama, tetapi: pertama, itu bekerja untuk saya, dan kedua, saya merasa lebih mudah untuk dipahami. Ubah "/ tmp / cron-env" ke tempat Anda menyimpan lingkungan Anda. Ini dia:
sumber
Nah, pengguna sama dengan yang Anda masukkan ke entri crontab (atau crontab yang Anda masukkan ke dalamnya, secara bergantian), jadi itu adalah no-brainer.
crontab
(5) harus memberi Anda daftar variabel lingkungan yang ditetapkan, hanya ada beberapa.sumber
Pada kebanyakan crontab seperti misalnya vixie-cron, Anda dapat menempatkan variabel di crontab itu sendiri seperti ini dan kemudian menggunakan / usr / bin / env untuk memeriksa apakah itu berfungsi. Dengan cara ini Anda dapat membuat skrip Anda berfungsi di crontab setelah Anda menemukan apa yang salah dengan skrip run-as-cron.
sumber
Solusi Marco tidak berhasil untuk saya tetapi skrip python Noam berhasil. Berikut sedikit modifikasi pada skrip Marco yang membuatnya berfungsi untuk saya:
set -a
Variabel ekspor yang ditambahkan didefinisikan dalam skrip $ 1 dan membuatnya tersedia untuk memerintahkan $ 2ps Noam's python bekerja karena 'mengekspor' lingkungan ke proses anak.
sumber
Jika ini adalah skrip shell, ini akan membantu Anda:
Ini pasti akan menyoroti beberapa masalah, jika tidak semuanya.
sumber
Saya tidak pernah menemukan cara untuk menjalankan pekerjaan cron secara manual tetapi artikel ini menyarankan pengaturan lingkungan yang sama dengan yang dimiliki cronjob dan menjalankan skrip secara manual.
sumber
Anda dapat memprogram pekerjaan untuk memulai menit berikutnya :)
sumber
Aku mengomentari jawaban Marco. Kode ditampilkan di bawah, tetapi saya akan mempertahankan skrip ini di sini .
Diberikan crontab ini:
Sesi penggunaan sampel:
Ini
cronTest2
, yang perlu dipanggil dengan benar untuk mengatur variabel lingkungan dengan cara yang sama seperti yang dilakukan cron:cronTest
berjalancronTest2
dengan set variabel lingkungan yang tepat:sumber