eksekusi crontab tidak memiliki variabel lingkungan yang sama dengan mengeksekusi pengguna

20

Saya menjalankan pekerjaan crontab saya 0 2 */1 * * /aScript >aLog.log 2>&1sebagai 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)

Bambu
sumber
8
Cron selalu berjalan dengan lingkungan yang sebagian besar kosong. HOME, LOGNAME, dan SHELL diatur; dan PATH yang sangat terbatas. Jika Anda tidak ingin mengatur sendiri semua variabel, Anda mungkin dapat melihat sourceprofil (bash) Anda.
cyberx86
2
@ cyberx86: Mengapa tidak menuliskannya sebagai jawaban dan mendapatkan perwakilan?
user9517 mendukung GoFundMonica
2
@ Iain: rep selalu diterima - tetapi kadang-kadang terasa seperti jawaban satu baris tidak benar-benar menghasilkan rep. Saya sepenuhnya menerima bahwa jawaban singkat ada di tempatnya, tetapi saya telah (mungkin salah) menggunakan komentar sebagai 'jalan keluar yang mudah' ketika saya ingin memberikan bantuan, tetapi tidak menulis penjelasan lengkap dan terperinci (saat itu jam 1 pagi. ..) Namun saya akan mengambil saran Anda dan mengembangkan yang ini sedikit dan menambahkannya sebagai jawaban.
cyberx86
@ cyberx86: Lebih baik memiliki satu liner yang benar daripada yang salah atau tidak sama sekali.
user9517 mendukung GoFundMonica

Jawaban:

31

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):

env > /path/to/my_env.sh

Kemudian impor melalui skrip cron Anda:

env - `cat /path/to/my_env.sh` /bin/sh

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.

cyberx86
sumber
Pendekatan 2 adalah yang terbaik untuk server di mana Anda memiliki hal-hal sensitif yang tidak boleh mengenai disk di env vars - kata sandi, kunci api, dll. Bekerja dengan baik bagi saya, jadi terima kasih.
ap
Pendekatan 4 bekerja untuk saya di lingkungan buruh pelabuhan di mana mesin buruh pelabuhan mengatur env vars. Agar ini berfungsi, saya harus menyimpan env saya di titik masuk buruh pelabuhan. Solusi lengkapnya ada di sini: github.com/rayyanqcri/swarm-scheduler
hammady
Bisakah Anda menguraikan pendekatan 3 untuk saya? Ketika saya mencoba mengimpornya saya mendapatkanbash: SHELL=/bin/bash: No such file
KuboMD
1

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.

Farhan
sumber
1

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.

pengguna215450
sumber
0

Saya memiliki masalah serupa pada AWS saya. Menemukannya seperti itu

which python3

memberi saya /usr/bin/local/python3lokasi

lalu

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
Al Po
sumber