'ไดเรกทอรีทำงาน' คืออะไรเมื่อ cron ประมวลผลงาน?


170

ฉันมีสคริปต์ที่ทำงานเมื่อฉันเรียกใช้จากบรรทัดคำสั่ง แต่เมื่อฉันกำหนดเวลาด้วยcronฉันพบข้อผิดพลาดที่ไม่สามารถค้นหาไฟล์หรือคำสั่งได้ คำถามของฉันคือสองเท่า:

  1. เมื่อฉันจัดตารางเวลางาน cron โดยใช้crontab -eมันใช้ ID ผู้ใช้ของฉันเป็นพื้นฐานสำหรับการอนุญาตหรือไม่ หรือว่าจะใช้ ID ผู้ใช้ cron ของบางประเภทและสิทธิ์ที่เกี่ยวข้อง?

  2. เมื่อเปิดใช้งาน cron แล้วไดเรคทอรี่การทำงานคืออะไร? เป็นไดเรกทอรีที่ฉันระบุสคริปต์ให้เรียกใช้หรือไดเรกทอรีอื่นหรือไม่

นี่คืองาน cron ของฉัน:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

นี่คือสคริปต์จริง:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt

นี่คือข้อผิดพลาดที่ฉันได้รับเมื่อฉันดูmailข้อความที่ผลิตโดยcron:

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found

ไม่พบtemplate.txtแต่มันอยู่ในไดเรกทอรีเดียวกับสคริปต์ มันไม่สามารถทำงานได้ssmtpแต่ฉันสามารถเป็นผู้ใช้ของฉันได้ อะไรที่ฉันขาดหายไปในการทำงานอย่างถูกต้อง?

คำตอบ:


158

เพิ่มcd /home/xxxx/Documents/Scripts/ถ้าคุณต้องการให้งานของคุณทำงานในไดเรกทอรีนั้น ไม่มีเหตุผลใดที่ cron จะเปลี่ยนเป็นไดเรกทอรีนั้น Cron รันคำสั่งของคุณในไดเรกทอรีบ้านของคุณ

ในฐานะที่เป็นมันอาจจะไม่อยู่ในเริ่มต้นของคุณssmtp PATHเส้นทางเริ่มต้น Cron คือการดำเนินการขึ้นอยู่กับเพื่อตรวจสอบหน้าคนของคุณ แต่ในทุกโอกาสที่ssmtpอยู่ใน/usr/sbinที่ไม่ได้อยู่ในเริ่มต้นของคุณPATHรากเท่านั้น

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

@Giles - ขอบคุณจะcronเป็นของตัวเองPATHหรือฉันสามารถตรวจสอบผู้ใช้ของฉันได้PATHหรือไม่ ฉันตั้งค่า ssmtp ให้เป็นของตัวเองuserและwheelอนุญาตให้คิดว่าจะอนุญาตให้ทุกคนใช้งานได้ (รวมถึง cron) ถ้าช่วยฉันด้วย CENTOS 6.2
ProfessionalAmateur

3
@ProfessionalAmateur ปัญหาของคุณไม่ว่าคุณไม่ได้รับอนุญาตให้ใช้ssmtpแต่ที่งาน cron ของคุณไม่พบปฏิบัติการใด ๆ ที่เรียกว่าเพราะมันไม่ได้อยู่ในของคุณssmtp PATHไม่มีสิ่งเช่น "ผู้ใช้ของคุณPATH"; นี่เป็นการตั้งค่าตามกระบวนการไม่ใช่การตั้งค่าสำหรับผู้ใช้แต่ละราย คุณสามารถกำหนดเส้นทางสำหรับงาน cron ทั้งหมดของคุณโดยการวางPATH=…สายใน crontab ของคุณ
Gilles

ฉันต้องเพิ่ม MAILTO='XXXX@gmail.com 'เพื่อให้มันทำงานได้พร้อมกับการตั้งค่า PATH แปลก แต่มันก็ได้ผลสำหรับฉัน
แม็ค

สำหรับ ssmtp หนึ่งสามารถใช้; ´which ssmtp´ ...
Fredrick Gauss


20

หาก cronjob ของคุณเป็นสคริปต์ทุบตีซีดีต่อไปนี้จะไปยังตำแหน่งของสคริปต์ของคุณ (สมมติว่าคุณกำลังใช้เส้นทางที่แน่นอนในการกำหนด cron ของคุณ):

cd "$(dirname "$0")";

14

เพื่อตอบคำถามที่ 1: ถ้าคุณเรียกใช้crontab -eในฐานะผู้ใช้ของคุณเองงานจะถูกกำหนดเวลาไว้ใน crontab ของผู้ใช้รายนั้นและจะทำงานโดยได้รับอนุญาตจากผู้ใช้รายนั้น

แต่คุณต้องพิจารณาว่างานจะทำงานในเชลล์ที่ไม่มีการโต้ตอบซึ่งหมายความว่า $ PATH อาจแตกต่างจากที่คุณมีเมื่อใช้งานสคริปต์จากบรรทัดคำสั่ง

เป็นการดีที่สุดที่จะใช้พา ธ แบบเต็มในสคริปต์เสมอโดยเฉพาะอย่างยิ่งหากคุณวางแผนที่จะกำหนดเวลาผ่านทาง / cron เป็นต้น

ฉันขอแนะนำให้ใช้เส้นทางแบบเต็มไปยังไฟล์ทั้งหมดเพื่อหลีกเลี่ยงปัญหาที่คุณเห็น

เพื่อป้องกันสภาพการแข่งขันและปัญหาด้านความปลอดภัยอื่น ๆ คุณควรใช้mktempเพื่อให้แน่ใจว่าไฟล์ที่คุณอ่านไม่ได้ถูกแก้ไขโดยสิ่งใดนอกสคริปต์ของคุณ

ดังนั้นฉันจะเปลี่ยนสคริปต์เป็นดังนี้:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cronรันงานที่กำหนดเวลาของผู้ใช้แต่ละคนเป็นผู้ใช้นั้น นี่น่าจะเพียงพอสำหรับเราที่จะทราบว่าสคริปต์ของคุณนั้นสัมพันธ์กับโฮมไดเร็กตอรี่ของคุณหรือไม่

หากคุณต้องการให้เรียกใช้จากตำแหน่งอื่นให้ใช้cdสคริปต์ของคุณเพื่อไปยังตำแหน่งดังกล่าว

ssmtpอาจไม่ได้อยู่ในcronเส้นทางเริ่มต้นของ (มันถูกกำหนดให้แคบมากโดยการออกแบบบนแพลตฟอร์มส่วนใหญ่) คุณสามารถระบุเส้นทางแบบเต็มไปยังssmtpในสคริปต์ของคุณหรือคุณสามารถตั้งค่าเส้นทางอย่างชัดเจนใน) ไฟล์ crontab ของคุณซึ่งจะสามารถใช้ได้กับสคริปต์ทั้งหมดของคุณหรือ b) ในแต่ละสคริปต์


3

ตรวจสอบกระทู้นี้ว่าคุณจะสามารถค้นหาสภาพแวดล้อมของ cron ได้อย่างไรมันน้อยกว่าที่คุณคุ้นเคยในเปลือกโต้ตอบ ดีที่สุดคือการสมมติว่าไม่มีอะไรถูกตั้งค่าและตั้งค่าด้วยตัวคุณเองอย่างชัดเจน


1

เริ่มต้นไดเรกทอรีการทำงานสำหรับในการดำเนินงานเป็นไดเรกทอรีบ้านโดยทั่วไปcron/home/your-user-name

การยอมรับ @Kusalananda ความคิดเห็นที่ยอดเยี่ยม


1
ไม่มันขึ้นอยู่กับตำแหน่งที่ระบบเก็บโฮมไดเร็กตอรี่ /homeอยู่ไกลจากสากล
Kusalananda

1
@Kusalananda LSB /homeมาตรฐานกล่าวว่า
เตอร์

1
@peterh เอ่อการใช้ macOS /Usersและ Unices ที่/usrผ่านมาและแม้กระทั่งบน Linux ไดเรกทอรีหลักของผู้ใช้อาจอยู่ที่ใดที่หนึ่งภายใต้/varหรือที่อื่น
Kusalananda

1
@ Kusalananda มันถูกต้อง
peterh

ขอขอบคุณคุณเพียงคนเดียวที่จริงตอบคำถามนี้ :)
เจ้าของ

0

บางคนบอกใบ้หรือเชื่อมโยงกับมัน แต่วิธีที่ดีที่สุดในการค้นหาเนื่องจากฉันไม่พบมันในเอกสารของมนุษย์สำหรับ distro ของฉันเพียงแค่เพิ่มสิ่งนี้ลงใน cron

* * * * * echo $PATH > /tmp/lolcronjobs

ในกรณีของฉัน Ubuntu เริ่มต้นการใช้เท่านั้น/usr/bin:/binซึ่งทำให้เกิดปัญหาบางอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.