ฉันจะรอโปรแกรมที่เริ่มต้นในเชลล์อื่นได้อย่างไร


20

ฉันมีโปรแกรมที่ทำงานจำนวนมาก (ใช้เวลาประมาณ 4-5 ชั่วโมง) ที่เริ่มทำงานโดย cron เมื่อข้อมูลทั้งหมดที่ใช้งานได้นั้นพร้อมใช้งาน บางครั้งเมื่อฉันรอให้เสร็จฉันต้องการให้โปรแกรมอื่น (โต้ตอบ) เริ่มทำงานเมื่อเสร็จสิ้น การรอสายดูดี แต่จะรอให้เด็ก ๆ


วิธีอื่นที่ฉันนึกได้คือการสร้างไฟล์จาก cronjob จากนั้นใช้ inotifywait ในกระบวนการนั้นเมื่อไฟล์ถูกลบกระบวนการที่ 2 ของคุณ (กำลังเรียกใช้ inotifywait) สามารถเริ่มต้นได้
slm

ฉันคิดว่าคุณสามารถทำบางสิ่งตามบรรทัดเหล่านี้ได้ipcเช่นกันโดยใช้การสื่อสารระหว่างกระบวนการ man ipc.
slm

แม้ว่าคุณจะไม่ได้รับบริการที่จะเริ่มต้นใหม่พระเจ้า Monit หรือหนึ่งใน pkgs อื่น ๆ ที่กล่าวถึงในคำถามและคำตอบนี้จะทำงานเช่นกัน: unix.stackexchange.com/questions/75785/…
slm

@slm สามารถ inotify สามารถใช้กับระบบไฟล์ใด ๆ เช่นรอบน close_write บน / proc / _pid_ / fd / 1?
hildred

ไม่แน่ใจทั้งหมด แต่อาจเป็นอีกวิธีในการทำ 8-) มีบางคำถามที่ฉันจำได้ว่ามีบางฟังก์ชันเคอร์เนลใหม่ที่เกี่ยวข้องกับการตรวจสอบกระบวนการคล้ายกับ inotifywait (สำหรับไฟล์) ฟีเจอร์ใหม่นี้มีไว้สำหรับเหตุการณ์ที่กำลังดำเนินอยู่ฉันคิดว่า แต่คำถามและคำตอบหลายข้อเริ่มต้นที่จะทำงานร่วมกันในความคิดของฉัน 8-) ฉันคิดว่า A ถูกจัดหาโดยฉันหรือ Gilles
slm

คำตอบ:


13

ฉันชอบโซลูชันEDIT # 3 อย่างแน่นอน(ดูซอลเบลโลว์)

ถ้ามันไม่อยู่ในเชลล์เดียวกันให้ใช้whileลูปพร้อมเงื่อนไขกับps -p ที่คืนค่าจริง ทำให้sleepในลูปเพื่อลดการใช้งานตัวประมวลผล

while ps -p <pid> >/dev/null 2>&1
do
   sleep 10
done 

หรือถ้า UNIX ของคุณรองรับ / proc (ตัวอย่างเช่น HP-UX ยังไม่เกิดขึ้น)

while [[ -d /proc/<pid> ]]
do 
    sleep 10
done

หากคุณต้องการหมดเวลา

timeout=6  # timeout after 1mn  
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
   sleep 10
   ((timeout -= 1))
done 

แก้ไข # 1

ไม่ได้ใช้: มีวิธีอื่น ๆ คือcron ใช้ชุดคำสั่งเพื่อสแต็คงานของคุณ

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

แก้ไข # 2

สร้าง Fifo ในโฮมไดเร็กตอรี่ของคุณ:

$ mkfifo ~/tata

ในตอนท้ายของงานของคุณ:

echo "it's done" > ~/tata

ในช่วงเริ่มต้นของงานอื่น ๆ (คนที่รอ):

cat ~/tata 

มันไม่ใช่การสำรวจความคิดเห็นเพราะมันเก่าดีในการบล็อก IO

แก้ไข # 3

ใช้สัญญาณ:

ในตอนต้นของสคริปต์ที่กำลังรอ:

echo $$ >>~/WeAreStopped
kill -STOP $$

ในตอนท้ายของงานที่ยาวนานของคุณ:

if [[ -f ~/WeAreStopped ]] ; then
    xargs kill -CONT < ~/WeAreStopped
    rm ~/WeAreStopped
fi

การสำรวจความคิดเห็น yuck! การตัดสินใจที่ดี: เสียเวลาประมวลผลหรือเวลาของฉันสำหรับการปรับการนอนหลับ จะต้องมีคำตอบที่ดีกว่า
hildred

:) การลงคะแนนเลือกตั้งเป็นสิ่งที่ดีสำหรับคุณ
Emmanuel

การสำรวจช้าการโพลจะเสียเวลาตัวประมวลผล
hildred

ด้วยเวลา exec ของ 0.01s ที่ 1440 ps ดำเนินการในช่วง 4 ชั่วโมงจะมีการบริโภค 14.4s น้อยกว่าผู้จัดการการจัดตารางเวลางานที่ต้องพึ่งพา: D
Emmanuel

ฉันคิดว่านี่น่าจะเป็นตัวเลือกที่ดีที่สุด: stackoverflow.com/questions/1058047/…แม้ว่ามันจะแฮ็กก็ตาม
slm

5

คุณสามารถแก้ไขงาน cron ของคุณเพื่อใช้การตั้งค่าสถานะบางอย่าง

แทน

2  2 * * *           /path/my_binary

คุณสามารถใช้ได้

2  2 * * *           touch /tmp/i_m_running; /path/my_binary; rm /tmp/i_m_running

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

ตัวอย่างสคริปต์:

while [[ -f /tmp/i_m_running ]] ; do
   sleep 10 ;
done
launch_whatever_you_want

ในกรณีที่คุณไม่ต้องการใช้sleepคุณสามารถแก้ไขสคริปต์และเรียกใช้สคริปต์ผ่าน cron หนึ่งครั้งต่อ X นาที

ในกรณีตัวอย่างสคริปต์จะเป็น:

[[ -f /tmp/i_m_running ]] && { echo "Too early" ; exit ; }
launch_whatever_you_want

วิธีนี้ง่ายกว่าเล็กน้อยเนื่องจากคุณไม่ต้องค้นหา PID ของกระบวนการ cron ของคุณ


4

ไม่มีสิ่งอำนวยความสะดวกสำหรับกระบวนการที่จะรอให้กระบวนการอื่นดำเนินการจนเสร็จสิ้นยกเว้นให้ผู้ปกครองรอให้กระบวนการลูกกระบวนการหนึ่งเสร็จสิ้น หากทำได้ให้เปิดโปรแกรมผ่านสคริปต์:

do_large_amount_of_work
start_interactive_program

หากคุณไม่สามารถทำได้เช่นก่อนที่คุณต้องการเริ่มงานจำนวนมากจากงาน cron แต่เป็นโปรแกรมแบบโต้ตอบจากบริบทของเซสชันของคุณให้ทำสิ่งนี้

do_large_amount_of_work
notify_completion

notify_completionมีหลายวิธีที่จะใช้เป็น สภาพแวดล้อมเดสก์ท็อปบางรุ่นมีกลไกการแจ้งเตือน ( เปิดหน้าต่างบนจอแสดงผล X ระยะไกล (ทำไม "ไม่สามารถเปิดจอแสดงผล")อาจมีประโยชน์) คุณยังสามารถสร้างได้โดยใช้การแจ้งเตือนการเปลี่ยนไฟล์ บน Linux, ไฟล์สิ่งอำนวยความสะดวกแจ้งเตือนการเปลี่ยนแปลงเป็นinotify

do_large_amount_of_work
echo $? >/path/to/finished.stamp

หากต้องการตอบสนองต่อการสร้าง/path/to/finished.stamp:

inotifywait -e close_write -q /path/to/finished.stamp
start_interactive_program

หากคุณไม่สามารถเปลี่ยนวิธีการdo_large_amount_of_workเรียกใช้ แต่คุณรู้ว่าไฟล์ใดที่แก้ไขล่าสุดคุณสามารถใช้กลไกเดียวกันเพื่อตอบสนองเมื่อไฟล์นั้นถูกปิด นอกจากนี้คุณยังสามารถตอบสนองต่อเหตุการณ์อื่น ๆ เช่นการเปลี่ยนชื่อไฟล์ (ดูinotifywaitคู่มือสำหรับรายการความเป็นไปได้)


0

ให้สคริปต์ถูกทริกเกอร์โดย cronjob เรียกใช้เชลล์สคริปต์ที่ว่างเปล่าซึ่งคุณสามารถแทรกภารกิจติดตามหากคุณต้องการ

มันคล้ายกับแนวทางของ Gilles มาก

cronjob-task.sh ประกอบด้วย:

# do_large_amount_of_work

./post-execute.sh

ที่post-execute.shมักจะเป็นที่ว่างเปล่าถ้าคุณเห็นว่าคุณต้องการที่จะเรียกเป็นงานที่ติดตาม

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