Cron ไม่ได้ใช้เส้นทางของผู้ใช้ที่เป็น crontab และมีของตัวเองแทน มันสามารถเปลี่ยนแปลงได้อย่างง่ายดายโดยการเพิ่มPATH=/foo/bar
ที่จุดเริ่มต้นของ crontab และวิธีแก้ปัญหาแบบคลาสสิกคือการใช้เส้นทางที่แน่นอนไปยังคำสั่งที่เรียกใช้โดย cron แต่เส้นทางที่กำหนดไว้เริ่มต้นของ cron อยู่ที่ไหน?
ฉันสร้าง crontab พร้อมเนื้อหาต่อไปนี้ในระบบ Arch (cronie 1.5.1-1) และทดสอบบนกล่อง Ubuntu 16.04.3 LTS ด้วยผลลัพธ์เดียวกัน:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
ที่พิมพ์:
$ cat fff
/usr/bin:/bin
แต่ทำไม พา ธ ทั้งระบบเริ่มต้นถูกตั้งค่าไว้/etc/profile
แต่มีไดเร็กทอรีอื่น:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
ไม่มีอะไรเกี่ยวข้องใน/etc/environment
หรือ/etc/profile.d
ไฟล์อื่น ๆ ที่ฉันคิดว่าอาจจะอ่านโดย cron:
$ 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
นอกจากนี้ยังไม่มีอะไรเกี่ยวข้องในไฟล์ใด ๆ ใน/etc/skel
ไม่น่าแปลกใจและไม่ถูกตั้งค่าใน/etc/cron*
ไฟล์ใด ๆ:
$ 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
ดังนั้น PATH ของ cron เริ่มต้นสำหรับ crontabs ผู้ใช้จะถูกตั้งอยู่ที่ไหน? มันเป็นฮาร์ดโค้ดในcron
ตัวของมันเองเหรอ? มันไม่ได้อ่านไฟล์กำหนดค่าบางอย่างสำหรับสิ่งนี้ใช่ไหม
/etc/profile
เพราะมันใช้ไวยากรณ์เดียวกัน ( var=value
) เป็นcron
ตัวเองดังนั้นมันจะง่ายพอที่จะทำและ/etc/profile
เป็นที่รู้ของฉันอย่างกว้างขวางมาก สิ่งที่ทำให้ฉันประหลาดใจคือฉันไม่สามารถหาได้ว่าตั้งไว้ที่ไหน ตามที่สตีเฟ่นอธิบายไว้ด้านล่าง
zsh
เป็นเชลล์แบบโต้ตอบไม่สนใจ/etc/profile
(ซึ่งเฉพาะเจาะจงbash
)
profile
ไฟล์ต่างๆนั้นจะถูกอ่านโดยล็อกอินเชลล์เท่านั้น สิ่งเหล่านี้อาจหรืออาจไม่สามารถโต้ตอบได้
strings
กับโปรแกรมสามารถช่วยค้นหาค่าที่กำหนดรหัสยากเหล่านี้ได้เช่นกัน
cron
จะต้องดู/etc/profile
หรือใส่ใจเกี่ยวกับเปลือกหอยใด ๆ คำถามที่ดีกว่าคือทำไมไม่cron
อ่านPATH
จากlogin.defs
(บน Linux) หรือlogin.conf
(บน * BSD) ฉันคิดว่ามันเป็นรายละเอียดการใช้งานในท้ายที่สุด