Saya memiliki pekerjaan cron yang menjalankan skrip. Ketika saya menjalankan skrip melalui shell interaktif (ssh'ed to bash) berfungsi dengan baik. Ketika skrip berjalan dengan sendirinya melalui cron, ia gagal.
Dugaan saya adalah bahwa ia menggunakan beberapa variabel lingkungan yang ditetapkan dalam shell interaktif. Saya akan memecahkan masalah skrip dan menghapus ini.
Setelah saya membuat perubahan, saya tahu saya bisa mengantri script di cron untuk menjalankannya seperti biasanya, tetapi apakah ada cara saya bisa menjalankan script dari baris perintah, tetapi katakan untuk menjalankannya seperti dari cron - yaitu dalam lingkungan non-interaktif?
unset
.env
, dan Anda mungkin ingin mencobaenv -i ./my-script.sh
. Juga, apakah Anda menerima pesan kesalahan?Jawaban:
Perbedaan utama antara menjalankan perintah dari cron dan menjalankan di baris perintah adalah:
/bin/sh
);cron(8)
ataucrontab(5)
halaman manual; umumnya hanya adaHOME
, mungkinSHELL
, mungkinLOGNAME
, mungkinUSER
, dan kecilPATH
);%
karakter secara khusus (diubah menjadi baris baru);Doa berikut akan menjalankan potongan shell seperti jika dipanggil dari cron. Saya menganggap cuplikan tidak berisi karakter
'
atau%
.Lihat juga mengeksekusi skrip sh dari cron , yang dapat membantu menyelesaikan masalah Anda.
sumber
sudo -u user /path/to/script
juga menjadi cara untuk menjalankannya tanpa variabel ditetapkan?sudo
menghapus beberapa variabel dan menetapkan yang lain ke nilai yang diketahui, tetapi itu tergantung pada bagaimana hal itu dikonfigurasi. Ini sering dikonfigurasi untuk mempertahankan pengaturan lokal danTERM
, misalnya.Dari tautan @ sr_ ( Bagaimana mendapatkan lingkungan yang bersih di shell ksh? ), Saya melihat ke atas, dan Anda mungkin ingin mencoba ini:
sumber
echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh
keluaraninteractive himB
.Saya sarankan Anda menggunakan path absolut untuk skrip Anda ketika meletakkannya di cron dan menggunakan di tempat lain dan untuk setiap dan semua perintah linux yang digunakan di dalamnya, lebih baik menyatakannya sebagai variabel dan menggunakannya!
sumber
Cron tidak harus menggunakan shell yang sama yang Anda gunakan. memeriksa:
Untuk menentukan shell dan mencoba eksekusi skrip Anda di sana - apakah itu berfungsi? Ini adalah penyebab umum masalah bagi banyak orang menambahkan skrip ke cron.
Jika ini masalahnya - Anda dapat menambahkan "bash" ke awal skrip Anda di cron untuk memaksa skrip ini dieksekusi di bash. Jika ini tidak menyelesaikan masalah, beri tahu saya dan saya akan menggali sedikit lebih dalam.
sumber
Jika Anda ingin mengabaikan beberapa pertanyaan interaktif yang disediakan oleh beberapa skrip, Anda dapat mencoba:
Atau
yes "n"
jika Anda ingin Tidak semua pertanyaan.sumber
Untuk menjalankan skrip Anda dalam cangkang non-interaktif (tidak membahas detail
cron
), Anda dapat melakukannya melaluissh
.Uji apakah Anda benar-benar berakhir di cangkang non-interaktif:
Jalankan skrip dalam shell non-interaktif:
sumber