crontab PATH değişkeni nasıl ayarlanır


17

Crontab'dan bir komut dosyası çalıştırırken sorun yaşadım. Bazı araştırmalardan sonra sorunun PATH parametresinin / sbin içermemesi nedeniyle olduğunu anladım.

Ne / etc / crontab dahil ne baktım:

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

Bir test olarak - PATH değişkenini yazdırmak için basit cron işi:

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

çıktı:

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

Bu davranışı anlamıyorum ... PATH değişkenini nasıl ayarlarım ..? Ya da daha iyisi - ona nasıl yol eklenir?

Yanıtlar:


17

Benzer olsalar da, kullanıcı crontab (crontab -e kullanılarak düzenlenir) sistem crontab'ından farklıdır ve ayrı bir yol tutar (/ etc / crontab düzenleyerek düzenlenir).

Sistem crontab, komuttan önce bir kullanıcı adı ekleyerek 7 alana sahiptir. Kullanıcı crontab ise sadece 6 alana sahiptir ve zaman alanlarından hemen sonra doğrudan komuta girer.

Benzer şekilde, sistem crontab'ındaki PATH normalde / sbin dizinlerini içerirken kullanıcı crontab'ındaki PATH içermez. Kullanıcı crontab için PATH ayarlamak istiyorsanız, kullanıcı crontab içinde PATH değişkenini tanımlamanız gerekir.


Cron'daki kabuk komutlarına normal PATH'nizi eklemek için basit bir çözüm, cronjob'un bir giriş kabuğunda bash çalıştırarak profilinizin kaynağını almasıdır. örneğin yerine

* * * * * some command

Bunun yerine koşabilirsin

* * * * * bash -lc some command

Bu şekilde profiliniz PATH veya diğer ortam değişkenlerini özel bir şeye ayarlarsa, komutunuza da dahil edilir.


Teşekkürler, bu açıklıyor ... Ama bu şekilde sadece PATH ayarlayabilir ve düzenleyemiyorum, çünkü PATH = / sbin: $ PATH veya benzeri çalışmıyor. Denedim ...
csny

Evet, crontab'ınızda çalıştırılan tüm komutları bildiğiniz için, bu gibi bir durumda PATH'yi sıfırdan tanımlamanız gerekir, bu yüzden bunları dikkate almanız gerekir.
fasulye

@madumlao bash -lcyardımcı olmuyor. Şimdilik PATH'ı manuel olarak ayarlama konusunda iyiyim, ancak bazı komut dosyaları yüklersem, tam yol belirtmeden cronjobs'ta tanınmalarını istiyorum. Eminim bir şekilde mümkün ve bash -lcbir çözüm yolunda :)
csny

4
bash -lc, kullanıcı profilinizi oluşturan bir oturum açma kabuğu başlatır. Bu, ~ / .bash_profile, ~ / .profile veya ~ / .bashrc ... içinde ayarlanmış PATH'yi kullandığı anlamına gelir. O hasta bunun için benim cevap güncelleme çalışmaları yüzden ve varsa
madumlao

Harika. Teşekkürler Madunlao. ~ / .Bash_profile dosyasına el ile bin dosya klasörü ekledikten sonra, cronjob'ım iyi çalışıyor.
16:56

8

Varsayılan sistem çapında PATH'lere ve (/etc/profile.d dosyasında tanımlanan) diğer ENV değişkenlerine ihtiyacınız varsa, aşağıdakileri koymanız yeterlidir:

* * * * * . /etc/profile; your cmd

3

PATH'yi (veya diğer parametreleri) cronjob satırında veya tek bir satırda ayarlamak mümkündür. Ancak kabuk genişletme özelliğini kullanamazsınız PATH=$PATH:/usr/local/bin. Ancak tilde giriş dizini kısayolları için izin verilir.

Kitaplardan:

Bir crontab'daki etkin satır, bir ortam ayarı veya bir cron komutudur. Bir ortam ayarı şu şekildedir: name = değer, eşittir işaretinin (=) etrafındaki beyaz boşlukların isteğe bağlı olduğu ve değerdeki sonraki ilerleyen beyaz boşlukların ad olarak atanan değerin bir parçasıdır. Değer dizesi, önde gelen veya arkadaki boşlukları korumak için tırnak işaretleri içine yerleştirilebilir (tek veya çift, ancak eşleşen).

Daha man 5 crontabfazla bilgi için bakınız .

Yani bu işe yaramalı:

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

0

Aynı sorunu vardı ve betiğimi crontab çalıştırmak için başka bir yol buldum. Programınızı çalıştırmanın en kolay yolunun, programınızın dizinine cd yazabilecek bir komut dosyası yapmak olduğunu düşünüyorum . Ardından programınızı bu komut dosyasında arayın.

Bu bir komut dosyası örneğidir (kod adı = launcher.sh):

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

ardından komut dosyanızı yürütülebilir yapın:

chmod 755 launcher.sh

Ve nihayet betiğinizi crontab'a ekleyin

crontab -e

ve sonuna bu satırı ekleyin:

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

(Programı her açılışta çalışacak şekilde ayarladım)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.