วิธีการตั้งค่าตัวแปร crontab PATH


17

ฉันมีปัญหาในการเรียกใช้สคริปต์จาก crontab หลังจากการวิจัยบางอย่างฉันเข้าใจว่าปัญหาเกิดขึ้นเนื่องจากพารามิเตอร์ PATH ไม่รวม / sbin

ฉันดูว่ามันรวมอยู่ใน / etc / crontab:

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

เป็นการทดสอบ - งาน cron ง่าย ๆ ในการพิมพ์ตัวแปร PATH:

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

ผลลัพธ์คือ:

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

ฉันไม่เข้าใจพฤติกรรมนี้ ... ฉันจะตั้งค่าตัวแปร PATH ได้อย่างไร? หรือดีกว่า - วิธีเพิ่มเส้นทางไปยังมันได้อย่างไร

คำตอบ:


17

ในขณะที่พวกเขามีความคล้ายคลึงกันผู้ใช้ crontab (แก้ไขโดยใช้ crontab -e) แตกต่างจากและทำให้เส้นทางที่แยกจากระบบ crontab (แก้ไขโดยการแก้ไข / etc / crontab)

ระบบ crontab มี 7 ช่องใส่ชื่อผู้ใช้ก่อนคำสั่ง ในทางตรงกันข้ามผู้ใช้ crontab มีเพียง 6 ช่องเท่านั้นที่จะเข้าสู่คำสั่งทันทีหลังจากเขตเวลา

เช่นเดียวกัน PATH ในระบบ crontab โดยทั่วไปจะรวมไดเร็กทอรี / sbin ในขณะที่ PATH ใน crontab ผู้ใช้จะไม่ หากคุณต้องการตั้งค่า PATH สำหรับผู้ใช้ crontab คุณจะต้องกำหนดตัวแปร PATH ในผู้ใช้ crontab


วิธีแก้ปัญหาง่ายๆสำหรับการเพิ่ม PATH ปกติของคุณในคำสั่งเชลล์ใน cron คือการให้ cronjob มาหาโปรไฟล์ของคุณโดยใช้ bash ในเชลล์ล็อกอิน ตัวอย่างเช่น

* * * * * some command

คุณสามารถเรียกใช้แทน

* * * * * bash -lc some command

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


ขอบคุณที่อธิบายมัน ... แต่ด้วยวิธีนี้ฉันสามารถตั้งค่า PATH เท่านั้นและไม่สามารถแก้ไขได้เนื่องจาก PATH = / sbin: $ PATH หรือที่คล้ายกันใช้งานไม่ได้ ฉันพยายาม ...
csny

ใช่คุณจะต้องกำหนด PATH ตั้งแต่เริ่มต้นในกรณีเช่นนี้ซึ่งควรจะง่ายพอเนื่องจากคุณรู้คำสั่งทั้งหมดที่รันใน crontab ของคุณดังนั้นคุณต้องพิจารณาสิ่งเหล่านั้นด้วย
ถั่ว

@madumlao bash -lcไม่ช่วย ตอนนี้ฉันดีสำหรับการตั้งค่า PATH ด้วยตนเอง แต่ถ้าฉันติดตั้งสคริปต์บางตัวฉันต้องการให้พวกเขาเป็นที่รู้จักใน cronjobs โดยไม่ต้องระบุเส้นทางแบบเต็ม ฉันแน่ใจว่ามันเป็นไปได้อย่างใดและbash -lcเป็นในทางที่จะแก้ปัญหา :)
CSNY

4
bash -lc เริ่มต้นเชลล์การเข้าสู่ระบบซึ่งแหล่งข้อมูลโปรไฟล์ของผู้ใช้ของคุณ ซึ่งหมายความว่าใช้ชุดเส้นทางใน ~ / .bash_profile, ~ / .profile หรือ ~ / .bashrc ... คุณมีเส้นทางที่ตั้งไว้หรือไม่ ถ้าเป็นเช่นนั้นและมันก็ใช้งานไม่ได้อัพเดทคำตอบของฉัน
madumlao

ยิ่งใหญ่ ขอบคุณ Madunlao หลังจากที่ฉันเพิ่มโฟลเดอร์แฟ้ม bin ด้วยตนเองไปที่ ~ / .bash_profile cronjob ของฉันจะทำงานได้ดี
张健健

8

หากคุณต้องการ PATH ของระบบที่เป็นค่าเริ่มต้นและตัวแปร ENV อื่น ๆ (ซึ่งกำหนดไว้ใน /etc/profile.d) ให้ใส่ต่อไปนี้:

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

3

เป็นไปได้ที่จะตั้งค่า PATH (หรือพารามิเตอร์อื่น ๆ ) ในบรรทัด cronjob หรือในบรรทัดเดียว แต่คุณไม่สามารถใช้การขยายตัวของเชลล์PATH=$PATH:/usr/local/binได้ แต่ตัวหนอนได้รับอนุญาตสำหรับทางลัดไดเรกทอรีบ้าน

จากหนังสือ:

บรรทัดที่แอ็คทีฟใน crontab เป็นการตั้งค่าสภาพแวดล้อมหรือคำสั่ง cron การตั้งค่าสภาพแวดล้อมมีรูปแบบ: name = value โดยที่ช่องว่างสีขาวรอบเครื่องหมายเท่ากับ (=) เป็นทางเลือกและช่องว่างสีขาวที่ไม่นำหน้าใด ๆ ในลำดับต่อมาจะเป็นส่วนหนึ่งของค่าที่กำหนดให้กับชื่อ สตริงค่าอาจอยู่ในเครื่องหมายคำพูด (เดี่ยวหรือสอง แต่จับคู่) เพื่อรักษาช่องว่างนำหน้าหรือต่อท้ายสีขาว

ดู man 5 crontabข้อมูลเพิ่มเติม

ดังนั้นควรทำงาน:

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

0

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

นี่คือตัวอย่างของสคริปต์ (script name = launcher.sh):

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

จากนั้นทำให้สคริปต์ของคุณสามารถดำเนินการได้:

chmod 755 launcher.sh

และในที่สุดเพิ่มสคริปต์ของคุณไปที่ crontab

crontab -e

และเพิ่มบรรทัดนี้ในตอนท้าย:

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

(ฉันตั้งโปรแกรมให้ทำงานทุกครั้งที่รีบูต)

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