Cron, crontab olduğu kullanıcının yolunu kullanmaz ve bunun yerine kendine has bir yolu vardır. PATH=/foo/bar
Crontab'ı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/environment
veya 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? cron
Kendi içinde kodlanmış mı ? Bunun için bir çeşit yapılandırma dosyasını okumuyor mu?
/etc/profile
için, kendisiyle aynı sözdizimini ( var=value
) kullandığı için cron
, bu nedenle, yaptığım kadar kolay ve /etc/profile
bildiğ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
profile
dosyalar zaten sadece giriş kabukları tarafından okunur. Bunlar etkileşimli olabilir veya olmayabilir.
strings
bir programa karşı çalışmak bu kodlanmış değerleri bulmaya da yardımcı olabilir.
cron
bakmak/etc/profile
veya ilgilenmek için hiçbir sebep yoktur . Daha iyi bir soru neden (Linux'ta) veya (on * BSD) ' dancron
okumuyor . Sanırım sonuçta bu bir uygulama detayı.PATH
login.defs
login.conf