ฉันเป็นผู้ดูแลระบบและถูกขอให้เรียกใช้สคริปต์ลินุกซ์เพื่อล้างระบบ
คำสั่งคือ:
perl script.pl > output.log &
ดังนั้นคำสั่งนี้จึงลงท้ายด้วย&
เครื่องหมายมีความสำคัญเป็นพิเศษหรือไม่?
ฉันมีความรู้พื้นฐานเกี่ยวกับเปลือกหอย แต่ไม่เคยเห็นมาก่อน
ฉันเป็นผู้ดูแลระบบและถูกขอให้เรียกใช้สคริปต์ลินุกซ์เพื่อล้างระบบ
คำสั่งคือ:
perl script.pl > output.log &
ดังนั้นคำสั่งนี้จึงลงท้ายด้วย&
เครื่องหมายมีความสำคัญเป็นพิเศษหรือไม่?
ฉันมีความรู้พื้นฐานเกี่ยวกับเปลือกหอย แต่ไม่เคยเห็นมาก่อน
&
และ&&
: &
เรียกใช้คำสั่งแรกในพื้นหลัง &&
เรียกใช้คำสั่งแรกและดำเนินการตามเงื่อนไขไปยังคำสั่งที่สองหากออกด้วยความสำเร็จ
คำตอบ:
&
ทำให้คำสั่งทำงานในพื้นหลัง
จากman bash
:
หากคำสั่งถูกยุติโดยตัวดำเนินการควบคุม&เชลล์จะเรียกใช้คำสั่งในพื้นหลังในเชลล์ย่อย เชลล์ไม่รอให้คำสั่งเสร็จสิ้นและสถานะการส่งคืนคือ 0
นอกจากนี้คุณสามารถใช้เครื่องหมาย "&" เพื่อเรียกใช้กระบวนการต่างๆผ่านการเชื่อมต่อ ssh หนึ่ง (1) เพื่อรักษาจำนวนเทอร์มินัลขั้นต่ำไว้ ตัวอย่างเช่นฉันมีกระบวนการหนึ่งที่รับฟังข้อความเพื่อแตกไฟล์กระบวนการที่สองฟังข้อความเพื่ออัปโหลดไฟล์: การใช้ "&" ฉันสามารถเรียกใช้บริการทั้งสองในเทอร์มินัลเดียวผ่านการเชื่อมต่อ ssh เดียวกับเซิร์ฟเวอร์ของฉัน .
***** ฉันเพิ่งตระหนักว่ากระบวนการเหล่านี้ที่ทำงานผ่าน "&" จะ "มีชีวิตอยู่" หลังจากปิดเซสชัน ssh ค่อนข้างเรียบร้อยและมีประโยชน์หากการเชื่อมต่อกับเซิร์ฟเวอร์ถูกขัดจังหวะ **
nohup
จะรักษากระบวนการต่างๆให้คงอยู่ด้วย
เมื่อไม่ได้รับคำสั่งเป็นอย่างอื่นจะเข้าควบคุมเบื้องหน้า คุณมีกระบวนการ "เบื้องหน้า" เพียงกระบวนการเดียวที่รันในเซสชันเชลล์เดียว สัญลักษณ์ & สั่งให้คำสั่งทำงานในกระบวนการเบื้องหลังและกลับไปที่บรรทัดคำสั่งทันทีสำหรับคำสั่งเพิ่มเติม
sh my_script.sh &
กระบวนการเบื้องหลังจะไม่คงอยู่หลังจากปิดเซสชันเชลล์ SIGHUPยุติกระบวนการทำงานทั้งหมด ตามค่าเริ่มต้นอยู่ดี หากคำสั่งของคุณทำงานเป็นเวลานานหรือทำงานไปเรื่อย ๆ (เช่น: microservice) คุณจำเป็นต้อง pr-pend ด้วย nohup เพื่อให้คำสั่งยังคงทำงานหลังจากที่คุณตัดการเชื่อมต่อจากเซสชัน
nohup sh my_script.sh &
แก้ไข:ดูเหมือนว่าจะมีพื้นที่สีเทาเกี่ยวกับการปิดกระบวนการพื้นหลังเมื่อ & ถูกใช้ เพิ่งทราบว่าเปลือกอาจปิดกระบวนการของคุณขึ้นอยู่กับระบบปฏิบัติการและการกำหนดค่าในท้องถิ่นของคุณ (โดยเฉพาะอย่างยิ่งใน CentOS / RHEL): https://serverfault.com/a/117157
ฉันไม่รู้แน่ชัด แต่ตอนนี้ฉันกำลังอ่านหนังสือและสิ่งที่ฉันได้รับคือโปรแกรมต้องจัดการสัญญาณของมัน (เหมือนตอนที่ฉันกดCTRL-C
) ตอนนี้โปรแกรมสามารถใช้SIG_IGN
เพื่อละเว้นสัญญาณทั้งหมดหรือSIG_DFL
เรียกคืนการกระทำเริ่มต้น
ตอนนี้ถ้าคุณทำ$ command &
แล้วกระบวนการนี้ทำงานเป็นกระบวนการพื้นหลังเพียงแค่ละเว้นสัญญาณทั้งหมดที่จะเกิดขึ้น สำหรับกระบวนการเบื้องหน้าสัญญาณเหล่านี้จะไม่ถูกละเว้น