Cron, crontab olduğu kullanıcının yolunu kullanmaz ve bunun yerine kendine has bir yolu vardır. PATH=/foo/barCrontab'ın başına ekleyerek kolayca değiştirilebilir ve klasik geçici çözüm, cron tarafından çalıştırılan komutlara her zaman mutlak yollar kullanmaktır, ancak cron'un varsayılan PATH'i nerede tanımlanır?
Arch sistemimde (cronie 1.5.1-1) aşağıdaki içerikleri içeren bir crontab oluşturdum ve aynı sonuçları içeren bir Ubuntu 16.04.3 LTS kutusunda test ettim:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
Bu yazdırıldı:
$ cat fff
/usr/bin:/bin
Ama neden? Varsayılan sistem genelindeki yol ayarlanır /etc/profile, ancak bu diğer dizinleri içerir:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
İlgili /etc/environmentveya başka hiçbir şey yok /etc/profile.d, muhtemelen cron tarafından okunabileceğini düşündüğüm diğer dosyalar:
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
Ayrıca, hiçbir dosyada, hiçbir şeyde /etc/skelşaşırtıcı bir şekilde, ne de hiçbir /etc/cron*dosyada ayarlanmış olan hiçbir şey yoktur :
$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin
Peki, cron'un kullanıcı crontab'ları için varsayılan PATH'i nerede belirleniyor? cronKendi içinde kodlanmış mı ? Bunun için bir çeşit yapılandırma dosyasını okumuyor mu?
/etc/profileiçin, kendisiyle aynı sözdizimini ( var=value) kullandığı için cron, bu nedenle, yaptığım kadar kolay ve /etc/profilebildiğim kadarıyla çok yaygın olacaktı. Beni şaşırtan şey, kodlanmış gibi göründüğü için herhangi bir yerde olduğunu bulamadım. Gerçekte olduğu gibi, Stephen aşağıda açıklandığı gibi.
zshİnteraktif kabukları olarak kullanan insanlar /etc/profile(kendine özgü bash) umrumda değil
profiledosyalar zaten sadece giriş kabukları tarafından okunur. Bunlar etkileşimli olabilir veya olmayabilir.
stringsbir programa karşı çalışmak bu kodlanmış değerleri bulmaya da yardımcı olabilir.
cronbakmak/etc/profileveya ilgilenmek için hiçbir sebep yoktur . Daha iyi bir soru neden (Linux'ta) veya (on * BSD) ' dancronokumuyor . Sanırım sonuçta bu bir uygulama detayı.PATHlogin.defslogin.conf