คำสั่งเชลล์แบบอะซิงโครนัส


103

ฉันกำลังพยายามใช้เชลล์สคริปต์เพื่อเริ่มคำสั่ง ฉันไม่สนใจว่า / เมื่อไหร่ / อย่างไร / ทำไมมันจบ ฉันต้องการให้กระบวนการเริ่มต้นและทำงาน แต่ฉันต้องการกลับไปที่เชลล์ของฉันทันที ...


2
ที่เกี่ยวข้องดูความแตกต่างระหว่าง nohup, disown และ &บน Unix และ Linux Stack Exchange
jww

1
สำหรับผู้ที่มองหาคำตอบในเชิงลึกมากกว่าที่พูดคุยเกี่ยวกับความแตกต่างระหว่างnohup, &และdisown , คลิกที่นี่เพื่อเลื่อนไปที่คำตอบที่สี่
noɥʇʎԀʎzɐɹƆ

คำตอบ:


118

คุณสามารถเรียกใช้สคริปต์ในพื้นหลัง:

$ myscript &

โปรดทราบว่าสิ่งนี้แตกต่างจากการใส่ไว้&ในสคริปต์ของคุณซึ่งอาจไม่ทำตามที่คุณต้องการ


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

2
อะไรคือความแตกต่างระหว่างการวาง & บนบรรทัดคำสั่งและวางไว้ในสคริปต์? ฉันไม่รู้ว่าพวกเขาแตกต่างกัน
Jacob Sharf

8
@JacobSharf ลองดูสิแล้วคุณจะเห็น หาก&อยู่ในสคริปต์และคุณไม่มีwaitคำสั่งพื้นหลังจะถูกฆ่าเมื่อสคริปต์ออก
Carl Norum

โอ้. นั่นอธิบายได้มากมาย เมื่อเร็ว ๆ นี้ฉันสังเกตเห็นผลกระทบบางอย่างที่อาจเกิดจากสิ่งนั้น Googling มันนำฉันไปสู่หน้านี้จริงๆ ขอบคุณ
Jacob Sharf

หากmyscriptปรับเปลี่ยนสภาพแวดล้อมเทอร์มินัลเช่น มันเป็นคำสั่งเริ่มต้นเทอร์มินัลที่ไม่จำเป็นในทันทีและอาจล่าช้าคำสั่งนี้จะยังคงแก้ไขสภาพแวดล้อมเทอร์มินัลหรือไม่
noɥʇʎԀʎzɐɹƆ

61

ทุกคนก็ลืมdisownไป ดังนั้นนี่คือบทสรุป:

  • & ทำให้งานอยู่เบื้องหลัง

    • ทำให้บล็อกเมื่อพยายามอ่านอินพุตและ
    • ทำให้เปลือกไม่ต้องรอให้เสร็จ
  • disown ลบกระบวนการออกจากการควบคุมงานของเชลล์ แต่ยังคงปล่อยให้กระบวนการเชื่อมต่อกับเทอร์มินัล

    • หนึ่งในผลลัพธ์คือเชลล์จะไม่ส่ง a SIGHUP(หากเชลล์ได้รับ a SIGHUPมันจะส่งไฟล์SIGHUPไปยังกระบวนการด้วยซึ่งโดยปกติจะทำให้กระบวนการยุติลง)
    • และเห็นได้ชัดว่าสามารถใช้ได้กับงานเบื้องหลังเท่านั้น (เนื่องจากคุณไม่สามารถป้อนได้เมื่องานเบื้องหน้ากำลังทำงานอยู่)
  • nohupยกเลิกการเชื่อมต่อกระบวนการจาก terminal, เปลี่ยนเส้นทางการส่งออกไปยังและโล่จากnohup.outSIGHUP

    • กระบวนการนี้จะไม่ได้รับใด ๆ SIGHUPที่ส่ง
    • เป็นอิสระอย่างสมบูรณ์จากการควบคุมงานและโดยหลักการแล้วสามารถใช้กับงานเบื้องหน้าได้ด้วย (แม้ว่าจะไม่มีประโยชน์มากนัก)
    • มักใช้กับ&(เป็นงานพื้นหลัง)

ฉันไม่พบdisownDebian หรือ OS X ฉันคิดว่ามันเป็นโปรแกรม แต่ดูเหมือนว่าฉันจะเข้าใจผิด มันคืออะไร?
jww


6
นี่คือคำตอบที่ดีที่สุด ครอบคลุมมากที่สุด
noɥʇʎԀʎzɐɹƆ

3
คำตอบที่ดีที่สุดไม่รู้ทำไมอัพน้อย
จัง

1
@VladGanshin No.
Ani Menon

41
nohup cmd

ไม่แฮงค์เมื่อคุณปิดเครื่อง เอาต์พุตตามค่าเริ่มต้นไปที่ nohup.out

คุณสามารถรวมสิ่งนี้เข้ากับพื้นหลัง

nohup cmd &

และกำจัดผลลัพธ์

nohup cmd > /dev/null 2>&1 &

คุณยังสามารถdisownสั่ง พิมพ์cmd, Ctrl-Z, bg,disown


2
เจ๋งมากที่ทุกอย่างรวมเข้าด้วยกันฉันคิดว่าการสั่งซื้อจะมาถึงฉันในตอนแรก แต่ฉันคิดว่าคุณสามารถจำได้ (สิ่งที่คุณเขียนหรือ "nohup cmd &> / dev / null 2> & 1" :))
LorenVS

ฉันสะดุดเมื่อคืนนี้ ฉันต่อสู้กับเชลล์สคริปต์มา 2 วันแล้วและข้อเสนอแนะนี้ทำให้ทุกอย่างได้ผล ขอบคุณ mucho!
JD Long

เจ๋งมากนี่มีประโยชน์มาก เมื่อทำงานในโหมดพื้นหลังคุณสามารถตรวจสอบผลลัพธ์ของคำสั่งทุก ๆ ครั้งโดยใช้tail nohup.outซึ่งจะแสดง 10 บรรทัดสุดท้ายของเอาต์พุตคำสั่ง ฉันใช้สิ่งนี้สำหรับงานสำรองข้อมูล rsync เพื่อดูว่าไฟล์นั้นอยู่ที่ไฟล์ใด
Martin Hansen

จะเป็นอย่างไรหากฉันทำสิ่งนี้ แต่ต้องการหยุดกระบวนการเบื้องหลัง
Stephan Bijzitter

เชลล์จะพิมพ์ตัวระบุงานเมื่อคุณเริ่มงานอย่างแม่นยำเพื่อจุดประสงค์นี้ คุณสามารถดูงานการทำงานของคุณในเวลาใด ๆ jobsกับ
tripleee

26

หรืออีกวิธีหนึ่งหลังจากที่คุณเรียกใช้โปรแกรมแล้วคุณสามารถกด Ctrl-Z ซึ่งจะหยุดโปรแกรมของคุณแล้วพิมพ์

bg

ซึ่งทำให้โปรแกรมที่หยุดล่าสุดของคุณอยู่เบื้องหลัง (มีประโยชน์หากคุณเริ่มต้นบางสิ่งโดยไม่มี '&' และยังคงต้องการให้อยู่ในส่วนหลังโดยไม่ต้องรีสตาร์ท)


2
ขอบคุณเคล็ดลับเล็ก ๆ น้อย ๆ ที่น่าสนใจ ... เริ่มที่จะชื่นชมความดีงามของเปลือกหอย ...
LorenVS

3

screen -m -d $command$เริ่มคำสั่งในเซสชันแยก คุณสามารถใช้screen -rแนบกับเซสชันที่เริ่มต้น เป็นเครื่องมือที่ยอดเยี่ยมมีประโยชน์อย่างยิ่งสำหรับการประชุมระยะไกล อ่านเพิ่มเติมได้ที่man screen.


@LadenkovVladislav ฉันมั่นใจ 95% ว่าคุณสามารถติดตั้งหน้าจอบน RedHat ได้ ฉันมีใน CentOS
BuvinJ

ใน Ubuntu ฉันต้องการจำลองคำสั่ง "start" ของ Windows / batch เช่นเปิดโปรแกรมเบื้องหน้า (gui) แบบอะซิงโครนัสและดำเนินการต่อผ่านเชลล์สคริปต์ สิ่งนี้ทำอย่างนั้น
BuvinJ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.