cara mengatur variabel PATH crontab

17

Saya punya masalah menjalankan skrip dari crontab. Setelah beberapa penelitian saya mengerti masalahnya adalah karena parameter PATH tidak termasuk / sbin.

Saya melihat apa yang ada di / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Sebagai tes - tugas cron sederhana untuk mencetak variabel PATH:

* * * * * echo $PATH &> /root/TMP.log

outputnya adalah:

cat /root/TMP.log
/usr/bin:/bin

Saya tidak mengerti perilaku ini ... Bagaimana saya mengatur variabel PATH ..? Atau lebih baik - bagaimana cara menambahkan path ke sana?

csny
sumber

Jawaban:

17

Meskipun mirip, crontab pengguna (diedit menggunakan crontab -e) berbeda dari dan menyimpan path terpisah dari sistem crontab (diedit dengan mengedit / etc / crontab).

Sistem crontab memiliki 7 bidang, memasukkan nama pengguna sebelum perintah. Crontab pengguna, di sisi lain, hanya memiliki 6 bidang, langsung ke perintah segera setelah bidang waktu.

Demikian juga, PATH dalam sistem crontab biasanya mencakup direktori / sbin, sedangkan PATH dalam crontab pengguna tidak. Jika Anda ingin mengatur PATH untuk crontab pengguna, Anda perlu mendefinisikan variabel PATH di crontab pengguna.


Solusi sederhana untuk menambahkan PATH reguler Anda di perintah shell di cron adalah memiliki sumber cronjob profil Anda dengan menjalankan bash di shell login. misalnya bukannya

* * * * * some command

Anda malah bisa berlari

* * * * * bash -lc some command

Dengan begitu jika profil Anda menetapkan PATH atau variabel lingkungan lainnya menjadi sesuatu yang istimewa, itu juga akan dimasukkan dalam perintah Anda.

madumlao
sumber
Terima kasih, itu menjelaskannya ... Tapi dengan cara ini saya hanya dapat mengatur PATH, dan tidak mengedit, karena PATH = / sbin: $ PATH atau sejenisnya tidak bekerja. Saya mencoba ...
csny
Ya, Anda perlu mendefinisikan PATH dari awal dalam kasus seperti ini, yang seharusnya cukup mudah, karena Anda tahu semua perintah yang dijalankan di crontab Anda, jadi Anda hanya perlu mempertimbangkannya.
kacang
@madumlao bash -lctidak membantu. Saya baik untuk saat ini dengan mengatur PATH secara manual, tetapi jika saya menginstal beberapa skrip, saya ingin mereka dikenali di cronjobs tanpa menentukan path lengkap. Saya yakin itu mungkin, entah bagaimana, dan bash -lcsedang menuju solusi :)
csny
4
bash -lc memulai shell login yang sumber profil pengguna Anda. Ini berarti ia menggunakan PATH yang diset di ~ / .bash_profile, ~ / .profile, atau ~ / .bashrc ... apakah Anda memiliki path yang ditetapkan di sana? Jika demikian dan berfungsi, perbarui jawaban saya untuk itu
madumlao
Bagus. Terima kasih Madunlao. Setelah saya menambahkan folder file bin secara manual ke ~ / .bash_profile, cronjob saya berfungsi dengan baik.
张健健
8

Jika Anda memerlukan PATH lebar sistem default dan variabel ENV lainnya (yang didefinisikan dalam /etc/profile.d), cukup cantumkan yang berikut:

* * * * * . /etc/profile; your cmd
Vladislav Savchuk
sumber
3

Dimungkinkan untuk mengatur PATH (atau parameter lainnya) di baris cronjob atau pada satu baris. Tetapi Anda tidak dapat menggunakan ekspansi shell seperti PATH=$PATH:/usr/local/bin. Tetapi tilde diizinkan untuk pintasan direktori home.

Dari buku-buku:

Baris aktif di crontab adalah pengaturan lingkungan atau perintah cron. Pengaturan lingkungan berupa: nama = nilai di mana spasi putih di sekitar tanda sama dengan (=) adalah opsional, dan spasi putih berikutnya yang tidak mengarah dalam nilai adalah bagian dari nilai yang ditetapkan untuk nama. String nilai dapat ditempatkan dalam tanda kutip (tunggal atau ganda, tetapi cocok) untuk mempertahankan spasi putih terdepan atau tertinggal.

Lihat man 5 crontabuntuk informasi lebih lanjut.

Jadi ini seharusnya bekerja:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
nyawa
sumber
0

Saya memiliki masalah yang sama dan saya menemukan cara lain untuk menjalankan skrip saya di crontab. Saya pikir cara termudah untuk menjalankan program Anda adalah dengan membuat skrip yang dapat di- cd ke direktori program Anda. Kemudian panggil program Anda dalam skrip itu.

ini adalah contoh skrip (skrip name = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

lalu, buat skrip Anda dapat dieksekusi:

chmod 755 launcher.sh

Dan akhirnya, tambahkan skrip Anda ke crontab

crontab -e

dan tambahkan baris ini di akhir:

@reboot sh /home/pi/test/launcher.sh

(Saya mengatur program untuk dijalankan pada setiap reboot)

Reyhaneh Trb
sumber