ฉันจะเพิ่มคำสั่ง 'shutdown' เพิ่มเติมให้กับกระบวนการที่กำลังรันอยู่ได้อย่างไร


11

เป็นประจำฉันลืมเพิ่ม&& shutdown -h nowกระบวนการที่ใช้เวลานาน มีวิธีการเพิ่มshutdown -h nowคำสั่งหลังจากเรียกคำสั่งแรกหรือไม่ มันไม่ได้มีวัตถุประสงค์เพื่อขัดจังหวะกระบวนการที่กำลังดำเนินอยู่ เป็นไปได้ไหมที่จะรับชม PID?


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

คำตอบ:


13

ไม่จำเป็นต้องเรียกใช้ ps ซ้ำ ๆ เพื่อแสดงรายการกระบวนการทั้งหมดและ grep ผ่านเอาต์พุต พื้นหลังกระบวนการด้วย ctrl-Z จากนั้นเรียกใช้

bg %1 ; wait %1 ; shutdown -h now

หากคุณมีงานพื้นหลังอื่น ๆ ที่ทำงานอยู่คุณจะได้รับ jobspec อื่นแทน [1] เมื่อคุณ ctrl-z ถ้าเป็นเช่นนั้นใช้สิ่งนั้นแทน


3

คุณสามารถทำสิ่งนี้ได้ซึ่งจะตรวจสอบว่ากระบวนการทำงานทุก 5 วินาทีและดำเนินการตามความเหมาะสม:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

สังเกตเครื่องหมายวงเล็บเหลี่ยมในgrepนิพจน์ นี่คือเพื่อให้แน่ใจว่าgrepกระบวนการไม่ได้รับการจับคู่ถ้ามันจบลงในpsรายการ การล้อมรอบอักขระเดี่ยวใด ๆ ด้วยวงเล็บเหลี่ยมก็เพียงพอแล้ว


+1 เนื่องจากใช้งานได้ ไม่ใช่วิธีที่ฉันจะทำ
Zoke

@Zoke: หากมีวิธีอื่นฉันจะสนใจ
Scott Severance

โพสต์คำตอบเช่นกัน ลองดูถ้าคุณชอบ
Zoke

คุณยังสามารถใช้ kill -0 (pid) เพื่อตรวจสอบการมีอยู่ของกระบวนการโดยไม่ต้องฆ่ามัน
ปุย

3

ฉันทำสิ่งนี้ตลอดเวลา

  1. เริ่มกระบวนการ
  2. ตระหนักว่าฉันลืมที่จะทำตาม&&คำสั่งของฉัน
  3. กดปุ่มCtrl+ Zเพื่อหยุดกระบวนการและกลับสู่เชลล์
  4. วิ่งfg && shutdown -h nowไปที่:
    1. เบื้องหน้าและกลับสู่กระบวนการที่คุณเพิ่งหยุดชั่วคราว
    2. จากนั้นเมื่อเสร็จสิ้นแล้วจะเรียกใช้สิ่งที่คุณต้องการเรียกใช้

หรือคุณสามารถสำรวจความคิดเห็นตามที่แนะนำในคำตอบอื่น ๆ เช่นนี้:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now

ที่จะปิดตัวลงทันที
psusi

fg เสร็จสมบูรณ์ในทันทีดังนั้น ...
psusi

@psusi ไม่มีมัน
Walking Wiki

@WalkingWiki โอ้แปลกคุณพูดถูก ฉันสาบานว่าจะทดสอบสิ่งนี้ในปี 2012 และเสร็จสมบูรณ์ทันที
psusi

1

หากคุณรู้ pid คุณสามารถเรียกใช้นี้:

while ps -p $PID; sleep 5; done; shutdown -h now

หากต้องการรันโดยไม่มีเสียงก้องจาก ps ให้ทำสิ่งนี้:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

และในที่สุดก็รันมันในพื้นหลังโดยไม่มีเอาต์พุตใด ๆ :

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

ทางออกของสกอตต์เป็นสิ่งที่ดี แต่สิ่งนี้ไม่จำเป็นต้องเพิ่มgrepซ้ำไปซ้ำมาถ้าคุณรู้จัก pid อยู่แล้ว และมันก็เร็วกว่ามากในการพิมพ์ระบบ: p


0

สร้างเชลล์สคริปต์เพื่อรันทั้งสองกระบวนการ:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

หลังจากบันทึกสิ่งนี้ในไดเรกทอรีที่คุณเริ่มกระบวนการที่กำหนดให้ทำ:

chmod +x MyShellScript.txt

จากนั้นเมื่อคุณต้องการเรียกใช้คำสั่งเพียงพิมพ์./MyShellScript.txtและมันจะทำเพื่อคุณ

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