Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

วิธีเรียกใช้คำสั่งในเบื้องหลัง [Linux/Ubuntu]

บทความนี้จะแสดงวิธีเรียกใช้คำสั่งในพื้นหลังเชลล์ของ Linux (รวมถึง Ubuntu) ซึ่งมีประโยชน์เมื่อต้องทำงานจากระยะไกลผ่าน SSH

สมมติว่าคุณเชื่อมต่อจากระยะไกลผ่าน SSH กับคอมพิวเตอร์ระยะไกล และคุณต้องการทำงานที่ใช้เวลานาน

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

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

การเรียกใช้คำสั่งในเบื้องหลังสามารถหลีกเลี่ยงได้ – คำสั่งจะทำงานต่อไปไม่ว่าการเชื่อมต่อ/เซสชันจะยังคงเปิดอยู่หรือไม่

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

การใช้ & เพื่อเรียกใช้คำสั่งในเบื้องหลัง

การเรียกใช้คำสั่งในพื้นหลังใน Linux นั้นง่ายมาก – เพิ่ม & อักขระต่อท้ายคำสั่งของคุณ:

your_command_here &

ตัวอย่างเช่น คำสั่งต่อไปนี้จะบีบอัดไฟล์คู่หนึ่ง - คำสั่งจะทำงานในเบื้องหลัง ดังนั้นคุณจึงไม่ต้องรอให้เสร็จก่อนที่จะรันคำสั่งอื่น:

zip archive.zip file1 file2 &

ง่าย! ผลลัพธ์จะมีลักษณะดังนี้:

[1] 3001

…ระบุงาน ( ในกรณีนี้ [1] ) และ ID กระบวนการ (ในกรณีนี้ 3001 ) ของคำสั่งที่กำลังดำเนินการในพื้นหลัง

เมื่องานเสร็จสมบูรณ์ (หรือล้มเหลว ) สถานะของงานจะถูกส่งออก:

[1]  + done       zip archive.zip file1 file2 

ซ่อนผลลัพธ์ของงานเบื้องหลัง

เอาต์พุตจากคำสั่งจะถูกพิมพ์ไปยังเทอร์มินัลต่อไปในขณะที่กำลังทำงานในพื้นหลัง

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

your_command > /dev/null 2>&1 &
  • ข้างบน > กำลังเปลี่ยนเส้นทาง STDOUT (เอาต์พุตมาตรฐาน) ของคำสั่งไปที่ /dev/null .
  • STDERROR (เอาต์พุตข้อผิดพลาดมาตรฐาน) ของคำสั่งถูกเปลี่ยนเส้นทางไปยัง STDOUT โดยใช้ 2>&! เพื่อให้ STDERR ไปที่ /dev/null เช่นกัน
  • /dev/null หมายถึงเอาต์พุตไปไหน หายไป ซ่อนเร้น ไม่มีอะไรเลย

แสดงรายการงานเบื้องหลังการทำงาน

ใช้งาน คำสั่งแสดงรายการงานพื้นหลังที่กำลังทำงานอยู่:

jobs -l

มันจะแสดงรายการงานพื้นหลังที่ทำงานอยู่ – แต่ละรายการจะมีลักษณะดังนี้:

[1]  + 3601 running    ping 8.8.8.8 > /dev/null 2>&1

ด้านบน คุณจะเห็นคำสั่ง ping 8.8.8.8> /dev/null 2>&1 กำลังทำงานในพื้นหลังโดยมีรหัสงาน 1 และรหัสกระบวนการ 3601

หยุดงานเบื้องหลัง

การ ฆ่า คำสั่งหยุดงาน:

kill 3601

… ใส่ รหัสกระบวนการ ของงานเบื้องหลัง และจะหยุด (ฆ่า) มัน

ทำให้งานพื้นหลังทำงานต่อไป แม้ว่าเซสชันจะถูกขัดจังหวะ

นี่อาจเป็นบิตที่มีประโยชน์ที่สุด

หากต้องการให้คำสั่งทำงานต่อไป แม้ว่าคุณจะปิดหน้าต่างหรือการเชื่อมต่อหลุด หรือเซสชันถูกขัดจังหวะ คุณจะต้องปิดงานพื้นหลังโดยใช้คำสั่ง disown

disown %1

ด้านบน งานพื้นหลังที่มีรหัสงาน 1 ถูกปฏิเสธ มันถูกตัดการเชื่อมต่อจากเชลล์ปัจจุบันและจะทำงานต่อไปจนกว่าจะเสร็จสิ้นหรือพบข้อผิดพลาดหรือถูกฆ่าโดยใช้คำสั่ง KILL

ดูบทความนี้เพื่อดูวิธีแสดงรายการกระบวนการที่ทำงานอยู่ทั้งหมด – คุณอาจจำเป็นต้องใช้หากต้องการติดตามงานที่คุณปฏิเสธ .

การย้ายคำสั่งการวิ่งไปที่พื้นหลัง

หากต้องการย้ายคำสั่งที่กำลังรันไปที่พื้นหลัง คุณต้องระงับคำสั่งนั้นไว้ชั่วคราว จากนั้นย้ายคำสั่งไปที่พื้นหลัง

เมื่อต้องการทำสิ่งนี้ ในขณะที่คำสั่งกำลังทำงานอยู่ ให้กด CTRL + Z . คุณจะเห็นบางอย่างเช่น:

suspended  command_name

…ยืนยันว่าคำสั่งถูกระงับ

จากนั้นป้อน bg คำสั่งให้รันคำสั่งต่อไปในเบื้องหลัง:

bg

คุณจะเห็นบางอย่างเช่น

continued  command_name

…ยืนยันว่าคำสั่งกำลังทำงานอยู่ในเบื้องหลัง