cron: เรียกใช้กระบวนการ แต่ถ้ามันไม่ทำงาน?


11

มีวิธีใดบ้างที่ฉันจะบอก cron ให้เรียกใช้แอป แต่ไม่เรียกใช้ถ้ามีกระบวนการอยู่แล้ว?

linux  cron 

คุณช่วยชี้แจงได้หรือไม่ว่าแอปไม่ควรรันหากแอปนั้นกำลังทำงานอยู่หรือไม่หรือกระบวนการอื่นกำลังทำงานอยู่ ขอบคุณ
Linker3000

คำตอบ:


23

วิธีที่ง่ายที่สุดใช้ pgrep

ใน crontab:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

รักความเรียบง่ายของคำตอบนี้ FYI, คุณควรจะสามารถเพิ่มแฟล็ก -f ใน pgrep และจากนั้นคุณสามารถตรวจสอบชื่อกระบวนการแบบเต็มซึ่งมีประโยชน์หากคุณต้องการตรวจสอบข้อโต้แย้งในกระบวนการซึ่งเป็นส่วนหนึ่งของเงื่อนไขของคุณ
Craig Sefton

6
ไม่คุณไม่สามารถใช้แฟล็ก -f กับ pgrep ภายใน cronjob เหตุผลก็คือคุณจะจับคู่กับเชลล์สคริปต์ที่ใช้ในการรัน cronjob เอง
CpnCrunch

เมื่อรันกระบวนการ GUI ด้วย cron ให้ใส่คำสั่งexport DISPLAY=:0เพื่อป้องกันCould not connect to displayข้อผิดพลาด * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Benjam

9

เรียกใช้สคริปต์แทนโปรแกรมโดยตรง มีความเป็นไปได้มากมาย ตัวอย่างเช่น :

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi

1
FYI - การใช้ตัวแปรสเกลาร์เพื่อเก็บรายการอาร์กิวเมนต์ถือว่าเป็นแนวปฏิบัติที่ไม่ดี ดูmywiki.wooledge.org/BashFAQ/050สำหรับตัวอย่างของกรณีที่มันล้มเหลว
Charles Duffy

... ในทำนองเดียวกันpgrep myprog; if [ $? -ne 0 ]; then ...จะเขียนได้ดีกว่าเป็นif ! pgrep myprog; then ...
Charles Duffy

... สไตล์หลังนี้ไม่เพียง แต่สามารถอ่านได้มากขึ้นเท่านั้น แต่ยังมีข้อผิดพลาดน้อยลงอีกด้วย: มันง่ายที่จะรบกวนค่าของ$?ตัวอย่างเช่นโดยเพิ่มข้อความบันทึกหรือการจัดการข้อผิดพลาดระหว่างบรรทัด
Charles Duffy

7

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

DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;

if flock -n -x 8; then
  echo ""
  echo "Starting your script..."
  echo ""

[PUT YOUR STUFF HERE]

  echo ""
  echo "Script started  $DATE";
  echo "Script finished `date +%c`";
else
  echo "Script NOT started - previous one still running at $DATE";
fi

3

คุณสามารถใช้แฟ้มล็อคในสคริปต์ของคุณ แต่โปรดดูการจัดการกระบวนการ

flock เป็นหนึ่งยูทิลิตี้ที่สามารถใช้


สิ่งที่ดี! ตอนนี้ rsync บนสายช้านี้อาจใช้เวลาทั้งหมดที่ต้องการยิงภายใน 5 นาทีจากโฮสต์ของลูกค้าที่เข้ามาในบรรทัดโดยไม่มีการแทรกแซงด้วยตนเอง:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

cronนี้มักจะถูกจัดการโดยโปรแกรมตัวเองมากกว่าโดย มีสองมาตรฐานเทคนิคนี้:

1) grepผลลัพธ์ของpsเพื่อดูว่ามีกระบวนการที่ใช้ชื่อนั้นทำงานอยู่หรือไม่

2) เมื่อเริ่มต้นให้ตรวจสอบการมีอยู่ของไฟล์ pid (รหัสกระบวนการ) โดยปกติที่/var/run/program_name.pidและถ้ามีอยู่ให้อ่าน pid จากไฟล์และตรวจสอบว่ากระบวนการนั้นยังคงมีอยู่หรือไม่ ถ้าเป็นเช่นนั้นปฏิเสธที่จะเริ่ม หากไฟล์ pid ไม่มีอยู่หรือ pid ในไฟล์หายไปจากนั้นสร้างไฟล์ pid เขียน id กระบวนการของคุณลงในนั้นและดำเนินการต่อด้วยการเริ่มต้นปกติ

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


0

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

ฉันได้นำคำตอบกลับมาใช้ซ้ำพร้อมกับปรับปรุงการจับคู่รูปแบบ pgrep โดยไม่มีตัวเลือก f ไม่ตรงกับรูปแบบกระบวนการ ยังมีปัญหากับการใช้ตัวเลือก f ด้วยตัวเลือก f เปลือกหอยที่วางไข่ cron จะถูกจับคู่เสมอและส่งคืน pid ดังนั้นกระบวนการจะไม่รีสตาร์ท

การเพิ่ม [] รอบรูปแบบตัวอักษรตัวหนึ่งตรงกับกระบวนการเท่านั้นและ pid ของเปลือก cron จะไม่ถูกส่งกลับ


0

เอกสาร: https://www.timkay.com/solo/

solo เป็นสคริปต์ที่ง่ายมาก (10 บรรทัด) ที่ป้องกันไม่ให้โปรแกรมทำงานมากกว่าหนึ่งสำเนาในเวลาเดียวกัน มันมีประโยชน์กับ cron เพื่อให้แน่ใจว่างานไม่ทำงานก่อนที่งานก่อนหน้าจะเสร็จสิ้น

ตัวอย่าง

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