ใช้คำสั่ง nohup หลายคำในพื้นหลัง


12

มีสองคำสั่ง cmd1 และ cmd2 ในทั้งสอง cmd2 ใช้เวลานานกว่าจะเสร็จสิ้น จำเป็นต้องเรียกใช้ cmd2 และ cmd1

พยายามเรียกใช้งานด้วยวิธีต่อไปนี้:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

หรือ

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

แต่ทั้งสองครั้งที่ฉันเห็น cmd1 ไม่รอให้ cmd2 เสร็จสิ้นและ result1 ก็จะเต็ม

วิธีที่จะทำให้ cmd1 ทำงานหลังจาก cmd2 เมื่อทั้งสองควรเป็นกระบวนการ nohup และทำงานในพื้นหลัง?


คำถามนี้ถูกถามไปแล้วunix.stackexchange.com/questions/67006/…
Rahul Patil

2
คำถามในunix.stackexchange.com/questions/67006/…นั้นแตกต่างกันเล็กน้อยเนื่องจากฉันต้องการรักษาลำดับการบังคับใช้ โปรดแก้ไขฉันหากฉันเข้าใจผิดในคำถามอื่น
user33767

คำตอบ:


12

คุณทำทั้งคู่cmd1และcmd2ทำงานแบบขนาน คุณพูดว่า:“ เริ่ม cmd2 ในพื้นหลังและตัดการเชื่อมโยงใด ๆ กับมัน เริ่ม cmd1 ในพื้นหลังและตัดการเชื่อมโยงใด ๆ กับมัน” คุณหมายถึง:“ เริ่ม cmd2 ในพื้นหลัง; เมื่อเสร็จแล้วให้เริ่ม cmd1 (เช่นเดียวกับในพื้นหลัง) เนื่องจากไม่มีการเชื่อมโยงกับงานพื้นหลังอีกต่อไปคุณจึงต้องวางแผนงานพื้นหลังที่ดำเนินการ cmd2 ตามด้วย cmd1 นี่คือcmd2; cmd1(หรือค่อนข้างcmd2 && cmd1จะเรียกใช้ cmd1 เฉพาะในกรณีที่ cmd2 ประสบความสำเร็จ) และคุณจะต้องบอกnohupให้เริ่มเชลล์ทำงานในพื้นหลังสำหรับสิ่งนั้น

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &

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

3

หากคุณไม่รังเกียจที่จะไม่ใช้ nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown

จะตรวจสอบว่า แต่ในปัจจุบันจะไปด้วยคำตอบจากไจล์สที่ซึ่งคำสั่งถูกห่อด้วยดวลจุดโทษ ขอบคุณอยู่ดี
user33767

นี่เป็นความคิดที่ไม่ดี เมื่อผู้ใช้ออกจากระบบจากคอนโซลมันจะฆ่าเซสชั่น
mootmoot

@mootmoot ใช้งานได้ตามที่ต้องการตรวจสอบด้วยตัวเอง คำสั่งจะไม่ได้รับ SIGHUP เมื่อแม่ออกจากเชลล์
ตี้

ใช่มันปลอดภัยสำหรับเชลล์หากคุณรันคำสั่งโดยใช้ crond / crontab แต่มันไม่ปลอดภัย pty / xterm / ssh unix.stackexchange.com/questions/3886/…
mootmoot

2

เพียงใช้:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &

ในขณะที่เรียกใช้คำสั่งหลายคำสั่งไม่เป็นไรฉันต้องการรักษาลำดับการดำเนินการที่แน่นอนเช่น cmd2 ก่อนจากนั้น cmd1 และจะไม่เกิดขึ้นกับคำสั่งด้านบน ขอบคุณ
user33767

0

แจ้งให้เราทราบว่าคุณทำอะไรกับ cmd2 และ cmd1 ขึ้นอยู่กับประเภทของงานและผลลัพธ์ที่คุณต้องการจากคำสั่งของคุณ หากคุณกำลังประสบปัญหากับการกดปุ่มสองครั้งด้วยการป้อนคำสั่งแล้วก็สามารถโพสต์ของฉันนี้

คุณสามารถไปทางนี้ได้ด้วย

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

ดูภาพหน้าจอที่ระบุด้านล่างนี่ฉันใช้ 3 คำสั่งและทั้งหมดกำลังดำเนินการทีละรายการ ฉันใช้ backticks สำหรับงานนี้ ในภาพหน้าจอคุณสามารถสังเกตการประทับเวลาวันที่ได้ คำสั่ง sleep มี 60 วินาทีดังนั้นหลังจาก 60 วินาทีคำสั่งถัดไปของฉันจะทำงานได้สำเร็จ ฉันใช้คำสั่ง jobs เพื่อตรวจสอบว่ามีคำสั่งใดทำงานอยู่ที่พื้นหลังหรือไม่ ที่นี่ไม่ ของงานที่คุณเห็นคือ 1

nohup-หลายคำสั่ง

ภาพหน้าจอนี้มีอยู่ในลิงค์นี้ด้วยหากมองไม่เห็น

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