วิธีแยกคำสั่งเชลล์ทั้งหมดที่ใช้การเปลี่ยนเส้นทางโดยสิ้นเชิง


13

ผมเคยเขียนค่อนข้างเชลล์สคริปต์ไม่กี่ปีที่ผ่านมา ( แต่ฉันไม่แน่นอนดูแลระบบ) และมีบางสิ่งบางอย่างที่ทำให้เกิดปัญหาเสมอฉัน: ฉันจะแยกเปลือกคำสั่งภูมิคุ้มกัน hangups ในพื้นหลังจากที่ทุบตีสคริปต์?

เช่นถ้าฉันมีสิ่งนี้:

command_which_takes_time input > output

ฉันจะ "nohup" และแยกสิ่งนี้ได้อย่างไร

ต่อไปนี้ดูเหมือนจะไม่ทำสิ่งที่ฉันต้องการ:

nohup command_which_takes_time input > output &

ฉันกำลังค้นหาไวยากรณ์อะไรและฉันไม่เข้าใจอะไร

คำตอบ:


13

ลองสร้าง subshell ด้วย(...):

( command_which_takes_time input > output ) &

ตัวอย่าง:

~$ ( (sleep 10; date) > /tmp/q ) &
[1] 19521
~$ cat /tmp/q # ENTER
~$ cat /tmp/q # ENTER
(...) #AFTER 10 seconds
~$ cat /tmp/q #ENTER
Wed Jan 11 01:35:55 CET 2012
[1]+  Done                    ( ( sleep 10; date ) > /tmp/q )

18

setsid(1)คุณควรพยายาม ใช้อย่างที่คุณต้องการใช้nohup:

setsid command_which_takes_time input > output

สิ่งนี้ (ตามsetsid(2)manpage) ทำ a fork(2), เป็น_exit(2)กระบวนการพาเรนต์จากนั้นโปรเซสลูกเรียกsetsid(2)เพื่อสร้างกลุ่มกระบวนการใหม่ (เซสชัน)

คุณไม่สามารถฆ่ามันได้โดยออกจากระบบและมันไม่ได้เป็นส่วนหนึ่งของการควบคุมงาน Bash shebang สำหรับทุกเจตนาและวัตถุประสงค์มันเป็นภูตที่เหมาะสม


4

มีdisownคำสั่ง bash builtin:

[1] 9180
root@ntb1:~# jobs
[1]+  Running                 sleep 120 &
root@ntb1:~# disown
root@ntb1:~# jobs
... no jobs, disowned
root@ntb1:~# ps aux | grep sleep | grep -v grep
root      9180  0.0  0.0   4224   284 pts/0    S    17:55   0:00 sleep 120
... but the sleep still runing
root@ntb1:~#

หลังจากการปฏิเสธงานจะถูกยกเลิกจากเชลล์ของคุณ (เพื่อให้คุณสามารถออกจากระบบ) และมันจะยังคงทำงานจนกว่าจะเสร็จสิ้น

ดูjobsคำสั่งที่1 แสดงรายการsleepอย่างไรก็ตามที่ 2 jobsหลังจากการปฏิเสธไม่ได้ทำ แต่ใช้psเราจะเห็นว่างานยังคงทำงานอยู่



-2

สิ่งนี้จะใช้งานได้ (อย่าพิมพ์ช่องว่างเพิ่มเติม):

command &>output.file

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