การเรียกใช้ crontab ไม่มีตัวแปรสภาพแวดล้อมเช่นเดียวกับการเรียกใช้งานผู้ใช้


20

ฉันรันงาน crontab ของฉัน0 2 */1 * * /aScript >aLog.log 2>&1ในฐานะผู้ใช้ 'รูท' และอย่างไรก็ตามฉันพบว่า env นั้นแตกต่างจาก env ของผู้ใช้ 'รูท' และดังนั้นจึงพบพฤติกรรมการใช้งานที่แตกต่างกันของสคริปต์ของฉัน

ความพยายามแก้ไขคือการวางคำสั่งส่งออกในไฟล์ rc.d แต่ก็ยังไม่ปรากฏขึ้น! ฉันจะวางคำสั่งส่งออกในaScriptด้วยตัวเอง

คำถามของฉันคือมีวิธีที่ดีกว่าในการแก้ไขปัญหานี้หรือไม่ และทำไม env ถึงหายไปแม้ว่าจะมาจาก 'รูต' ของผู้ใช้คนเดียวกัน? (ฉันแก้ไข crontab โดยใช้ 'crontab -e' จากรูท)


8
Cron มักจะทำงานในสภาพแวดล้อมที่ว่างเปล่าเป็นส่วนใหญ่ ตั้งค่า HOME, LOGNAME และ SHELL; และเส้นทางที่ จำกัด มาก หากคุณไม่ต้องการตั้งค่าตัวแปรทั้งหมดด้วยตัวคุณเองคุณอาจสามารถทำsourceโปรไฟล์ (ทุบตี) ได้
cyberx86

2
@ cyberx86: ทำไมไม่เขียนมันขึ้นมาเป็นคำตอบและรับตัวแทน?
user9517 รองรับ GoFundMonica

2
@Iain: ตัวแทนยินดีต้อนรับเสมอ - แต่บางครั้งก็รู้สึกเหมือนคำตอบหนึ่งบรรทัดไม่ได้รับตัวแทนจริงๆ ฉันยอมรับอย่างเต็มที่ว่ามีคำตอบสั้น ๆ แต่ฉันใช้ความคิดเห็นเป็น 'วิธีง่าย ๆ ' เมื่อฉันต้องการที่จะให้ความช่วยเหลือ แต่ไม่ได้เขียนคำอธิบายแบบละเอียดเต็มรูปแบบ .. ) อย่างไรก็ตามฉันจะใช้คำแนะนำของคุณและขยายในนี้เล็กน้อยและเพิ่มเป็นคำตอบ
cyberx86

@ cyberx86: ดีกว่าที่จะมีหนึ่งซับที่ถูกต้องกว่าไม่ถูกต้องหรือไม่มีอะไร
user9517 รองรับ GoFundMonica

คำตอบ:


31

Cron มักจะทำงานในสภาพแวดล้อมที่ว่างเปล่าเป็นส่วนใหญ่ ตั้งค่า HOME, LOGNAME และ SHELL; และเส้นทางที่ จำกัด มาก ดังนั้นจึงแนะนำให้ใช้เส้นทางที่สมบูรณ์เพื่อปฏิบัติการและส่งออกตัวแปรใด ๆ ที่คุณต้องการในสคริปต์ของคุณเมื่อใช้ cron

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

วิธีที่ 1:

ตั้งค่าตัวแปรแต่ละตัวที่คุณต้องการด้วยตนเองในสคริปต์ของคุณ

วิธีที่ 2:

ส่งโปรไฟล์ของคุณ:

. $HOME/.bash_profile(หรือ. $HOME/.profile)

(โดยทั่วไปคุณจะพบว่าไฟล์ด้านบนจะเป็นแหล่งไฟล์อื่น ๆ (เช่น ~ / .bashrc -> / etc / bashrc -> /etc/profile.d/*) - ถ้าไม่คุณสามารถหาแหล่งเหล่านั้นได้เช่นกัน)

วิธีที่ 3:

บันทึกตัวแปรสภาพแวดล้อมของคุณลงในไฟล์ (เรียกใช้ในฐานะผู้ใช้ที่ต้องการ):

env > /path/to/my_env.sh

จากนั้นนำเข้าผ่านสคริปต์ cron ของคุณ:

env - `cat /path/to/my_env.sh` /bin/sh

วิธีที่ 4:

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


วิธีที่ 2 ดีที่สุดสำหรับเซิร์ฟเวอร์ที่คุณมีสิ่งที่ละเอียดอ่อนซึ่งไม่ควรกดดิสก์ใน env vars - รหัสผ่านคีย์ API ฯลฯ ทำงานได้อย่างมหัศจรรย์สำหรับฉันขอบคุณมาก
ap

วิธีที่ 4 ทำงานสำหรับฉันในสภาพแวดล้อมของนักเทียบท่าที่เครื่องมือนักเทียบท่าตั้งค่า env vars เพื่อให้ทำงานได้ฉันต้องบันทึก env ของฉันไว้ที่จุดเข้านักเทียบท่า ทางออกที่สมบูรณ์อยู่ที่นี่: github.com/rayyanqcri/swarm-scheduler
hammady

คุณช่วยอธิบายเกี่ยวกับวิธีที่ 3 สำหรับฉันได้ไหม เมื่อฉันพยายามนำเข้าฉันจะได้รับbash: SHELL=/bin/bash: No such file
KuboMD

1

Cron สร้างเชลล์ของตัวเองด้วยการใช้งานที่ระบุผ่านซึ่งมันจะทำงาน

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

หรือ

วิธีที่ดีที่สุดคือการส่งออกตัวแปรเหล่านั้นในสคริปต์ของคุณเอง


1

ใน RedHat CentOS คุณสามารถตั้งค่า /etc/rc.d/init.d/functions PATH เริ่มต้นให้ตั้งค่าอย่างถาวร /etc/rc.d/crond เรียกใช้ฟังก์ชันเมื่อเริ่มต้น


0

ฉันมีปัญหาที่คล้ายกันใน AWS ของฉัน คิดออกเช่นนั้น

which python3

ให้/usr/bin/local/python3ตำแหน่งฉัน

แล้ว

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.