รันสคริปต์ sh จาก cron


12

ฉันมีสคริปต์ test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

เมื่อฉันรันไฟล์เป็น root จากบรรทัดคำสั่งมันทำงานได้

sh /home/v/test.sh 

เมื่อฉันตั้งค่าให้ crontab -e (เป็น cron รูท) ไม่ทำงาน

 * * * * * sh /home/v/test.sh

ฉันทำอะไรผิด ขอบคุณ


"ไม่ทำงาน" ไม่ทำงาน ดู? คุณไม่รู้ว่าฉันหมายถึงอะไรและเราก็ไม่รู้เหมือนกันว่าคุณหมายถึงอะไร ฉันหมายถึง (ใช่) อะไรไม่ทำงาน อาจจะเกี่ยวกับอะไรก็ได้ อาจเป็นการเดาของ tmow นั้นถูกต้อง แต่มันก็เป็นเพียงการคาดเดา
Jürgen A. Erhard

ใช่ถ้าคุณสามารถเจาะจงมากขึ้นกับผลลัพธ์ที่คุณเห็นเราจะสามารถระบุได้ว่าปัญหาคืออะไร คือคุณหมายถึง "ไม่ทำงาน" (:
gabe.

ฉันไม่เห็นบันทึกใด ๆ ใน syslog และสคริปต์กำลังแทรกบางส่วนลงในฐานข้อมูลซึ่งไม่ได้เกิดขึ้นและพวกเขาก็ดีใจถ้าฉันเรียกใช้สคริปต์ด้วยมือ
Elzo Valugi

คำตอบ:


15

ตามที่มนุษย์:

cron daemon เริ่ม subshell จากไดเรกทอรี HOME ของคุณ หากคุณกำหนดเวลาคำสั่งให้รันเมื่อคุณไม่ได้ล็อกอินและคุณต้องการคำสั่งในไฟล์. profile ของคุณให้รันคำสั่งต้องอ่านไฟล์. profile ของคุณอย่างชัดเจน

cron daemon ระบุสภาวะแวดล้อมดีฟอลต์สำหรับทุกเชลล์กำหนด HOME, LOGNAME, SHELL (= / usr / bin / sh)
และ PATH (= / usr / bin)

ดังนั้น cron daemon ไม่ทราบว่า php อยู่ที่ไหนและคุณควรระบุเส้นทาง php แบบเต็มด้วยมือเช่น (ฉันไม่ทราบเส้นทาง PHP จริงของคุณ):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

อีกวิธีหนึ่งคือแหล่งที่มา / etc / profile (หรือ. profile / .bashrc ของคุณ) เป็นต้น

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

สิ่งนี้มีประโยชน์หาก. bashrc ของคุณตั้งค่าตัวแปรสภาพแวดล้อมที่คุณต้องการ (เช่น PATH)

แก้ไข

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

...
PATH มีไดเรกทอรีที่จะอยู่ในเส้นทางการค้นหา cron เช่นหากคุณมีโปรแกรม 'foo' ในไดเรกทอรี / usr / cog / bin มันอาจคุ้มค่าที่จะเพิ่ม / usr / cog / bin ไปยัง เส้นทางเนื่องจากจะทำให้คุณไม่ต้องใช้เส้นทางแบบเต็มเพื่อ 'foo' ทุกครั้งที่คุณต้องการโทรหา
...


Bad $ PATH เป็นสาเหตุที่พบบ่อยที่สุดของสคริปต์ที่ทำงานด้วยมือ แต่ไม่ได้มาจาก cron
Patrick

@ แพทริกแน่นอนมันเป็นปัญหาถ้า cron ไม่รู้ว่าอยู่ที่ไหน php มิฉะนั้น Elzo crontab จะทำงานได้โดยไม่มีปัญหาใด ๆ มันจะต้องเป็นปัญหาของเส้นทาง
tmow

ขอบคุณมากสำหรับคำตอบของคุณ มันใช้งานได้กับฉันอย่างง่ายดายมาก !!! .. ขอบคุณมาก @tmow
Vignesh Prajapati

5

มีสาเหตุทั่วไปสี่ประการสำหรับคำสั่งที่ทำงานเมื่อพิมพ์ลงในเทอร์มินัล แต่ไม่ได้มาจาก cron ตามลำดับความธรรมดา:

  1. Cron จัดให้มีสภาพแวดล้อมที่ จำกัด เช่น$PATHตัวแปรขั้นต่ำและตัวแปรอื่น ๆ ที่ขาดหายไป
  2. Cron จะเรียกใช้ / bin / sh ตามค่าเริ่มต้นในขณะที่คุณอาจใช้เชลล์แบบโต้ตอบ
  3. Cron ปฏิบัติต่อตัวละคร% พิเศษ (มันกลายเป็นบรรทัดใหม่ในคำสั่ง)
  4. Cron ไม่ได้จัดเตรียมเทอร์มินัลหรือสภาพแวดล้อมแบบกราฟิก

หากงานของคุณสร้างผลลัพธ์ใด ๆ รวมถึงข้อความแสดงข้อผิดพลาด cron จะส่งอีเมลพร้อมผลลัพธ์ทั้งหมด ตรวจสอบให้แน่ใจว่าคุณได้อ่านอีเมลที่คุณได้รับภายในหรือส่งต่อไปยังที่อยู่ที่คุณอ่าน ในการส่งต่ออีเมลจากบัญชีภายในบางส่วนที่อยู่อื่น ๆ วางอยู่อื่น ~/.forwardๆ หากงาน cron กำลังทำงานในฐานะผู้ใช้ระบบ ( root,, webmaster... ) ตรวจสอบให้แน่ใจว่าอีเมลของผู้ใช้ถูกเปลี่ยนเส้นทางไปยังคุณ (และผู้ดูแลระบบคนอื่น ๆ ); ด้วยการตั้งค่าส่วนใหญ่จดหมายใส่เส้นเหมือนในroot: elzo/etc/aliases


2

cron daemon จะเรียกใช้งานคำสั่งของคุณในเชลล์ที่ตัวแปรสภาพแวดล้อม PATH ถูก จำกัด ไว้ที่ค่าเริ่มต้นของระบบเช่น / usr / bin: / bin

อาจเป็นphpคำสั่งของคุณไม่สามารถใช้ได้ใน / usr / bin หรือ / bin และทำให้สคริปต์ล้มเหลวเมื่อดำเนินการผ่าน cron และทำงานได้สำเร็จเมื่อไม่

Cron มักจะรายงานข้อผิดพลาดหรือข้อความงานผ่านอีเมลไปยังผู้ใช้รูท (เช่นเมื่อคำสั่งส่งคืนสถานะออก! = 0 หรือสร้างเอาต์พุตไปยัง stdout / stderr) หลังจากงานเสร็จสิ้น

ขึ้นอยู่กับระบบของคุณคุณต้องตั้งค่าการส่งจดหมายในเครื่องเพื่อรับข้อความเหล่านี้

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