Saya menjalankan pekerjaan crontab saya 0 2 */1 * * /aScript >aLog.log 2>&1
sebagai pengguna 'root', dan bagaimanapun saya menemukan env berbeda dari env dari pengguna 'root', dan karenanya mengalami perilaku runtime yang berbeda dari skrip saya.
Upaya perbaikan adalah menempatkan perintah ekspor di file rc.d, tetapi masih belum muncul! Saya akhirnya menempatkan perintah ekspor di aScript itu sendiri.
Pertanyaan saya adalah apakah ada cara yang lebih baik untuk mendekati masalah ini? dan mengapa env hilang meskipun berasal dari 'root' pengguna yang sama? (Saya memodifikasi crontab dengan menjalankan 'crontab -e' dari root)
linux
cron
environment-variables
Bambu
sumber
sumber
source
profil (bash) Anda.Jawaban:
Cron selalu berjalan dengan lingkungan yang sebagian besar kosong. HOME, LOGNAME, dan SHELL diatur; dan PATH yang sangat terbatas. Oleh karena itu disarankan untuk menggunakan path lengkap ke executable, dan ekspor variabel apa pun yang Anda butuhkan dalam skrip Anda saat menggunakan cron.
Ada beberapa pendekatan yang dapat Anda gunakan untuk mengatur variabel lingkungan Anda di cron, tetapi semuanya sama dengan mengaturnya di skrip Anda.
Pendekatan 1:
Tetapkan setiap variabel yang Anda butuhkan secara manual dalam skrip Anda.
Pendekatan 2:
Sumber profil Anda:
. $HOME/.bash_profile
(atau. $HOME/.profile
)(Anda biasanya akan menemukan bahwa file di atas akan sumber file lain (misalnya ~ / .bashrc -> / etc / bashrc -> /etc/profile.d/*) - jika tidak, Anda dapat mengambil sumbernya juga.)
Pendekatan 3:
Simpan variabel lingkungan Anda ke file (jalankan sebagai pengguna yang diinginkan):
Kemudian impor melalui skrip cron Anda:
Pendekatan 4:
Dalam beberapa kasus, Anda dapat mengatur variabel cron global
/etc/default/cron
. Namun ada elemen risiko untuk ini, karena ini akan ditetapkan untuk semua pekerjaan cron.sumber
bash: SHELL=/bin/bash: No such file
Cron menciptakan shellnya SENDIRI dengan penggunaan yang ditentukan melalui mana ia akan berjalan.
Jadi, jika Anda ingin mempertahankan variabel yang sama dari pengguna Anda, maka cobalah untuk menjalankannya dengan pengguna Anda sendiri, bukan root atau pengguna lain.
Atau
Cara terbaik adalah mengekspor variabel-variabel itu dalam skrip Anda sendiri.
sumber
Di RedHat CentOS, Anda dapat mengatur /etc/rc.d/init.d/fungsi default PATH untuk diatur secara permanen. /etc/rc.d/crond memanggil fungsi saat dimulai.
sumber
Saya memiliki masalah serupa pada AWS saya. Menemukannya seperti itu
memberi saya
/usr/bin/local/python3
lokasilalu
sumber