วิธีเรียกใช้คำสั่งในพื้นหลังและไม่ได้รับผลลัพธ์


112

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

คำตอบ:


222

ใช้ในnohupกรณีที่งานเบื้องหลังของคุณใช้เวลานานในการดำเนินการให้เสร็จสิ้นหรือคุณเพียงแค่ใช้ SecureCRT หรือบางอย่างเช่นเข้าสู่ระบบเซิร์ฟเวอร์

เปลี่ยนเส้นทางstdoutและstderrเพื่อ/dev/nullที่จะไม่สนใจเอาท์พุท

nohup /path/to/your/script.sh > /dev/null 2>&1 &

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

วิธีที่ดีกว่าที่ฉันพบคือการใช้nohup /path/to/your/script.sh parameter1 > & 1 &ถ้าใครรู้วิธีที่ดีกว่า
sabertooth1990

18
คุณไม่จำเป็นต้องใช้/dev/null 2>&1หากคุณกำลังใช้งานอยู่nohupเพราะมันต่อท้ายสตรีม STDOUT และ STDERR ทั้งหมดเข้ากับไฟล์ nohup.out โดยอัตโนมัติ ใช้เพียง:nohup /path/to/your/command &
Leonardo

1
@ sabertooth1990 บรรทัดคำสั่งของคุณผิดพลาด:-bash: syntax error near unexpected token '&'
notes-jj

1
แล้วคุณจะฆ่ากระบวนการที่สร้างขึ้นได้อย่างไร?
Alexis_A

33

เปลี่ยนทิศทางผลลัพธ์ไปยังไฟล์ดังนี้:

./a.sh > somefile 2>&1 &

สิ่งนี้จะเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังไฟล์เดียวกัน หากคุณต้องการเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์สองไฟล์ให้ใช้สิ่งนี้:

./a.sh > stdoutfile 2> stderrfile &

คุณสามารถใช้/dev/nullเป็นไฟล์เดียวหรือทั้งสองไฟล์หากคุณไม่สนใจเกี่ยวกับ stdout และ / หรือ stderr

ดูbash manpageสำหรับรายละเอียดเกี่ยวกับการเปลี่ยนเส้นทาง


23

ขออภัยนี่ช้าไปหน่อย แต่พบวิธีแก้ปัญหาที่ดีที่สุดสำหรับคำสั่งที่คุณไม่ต้องการเอาต์พุตมาตรฐานหรือข้อผิดพลาดใด ๆ (เครดิตที่ถึงกำหนด: http://felixmilea.com/2014/12/running-bash-commands-background - อย่างถูกต้อง / )

สิ่งนี้จะเปลี่ยนเส้นทางเอาต์พุตเป็น null และทำให้หน้าจอชัดเจน:

command &>/dev/null &

2
หมายเหตุ: คำสั่งจะสิ้นสุดลงเมื่อปิดเทอร์มินัล
Banana

1
สำหรับทุกคนที่กำลังมองหาสิ่งนี้ในอนาคตที่ต้องการโซลูชันเพื่อให้คำสั่งทำงานหลังจากเซสชันสิ้นสุดลงฉันขอแนะนำ screen หรือ tmux พวกเขาจำเป็นต้องเรียกใช้ 'เซสชันภายในเซสชัน' ซึ่งจะดำเนินการหลังจากที่คุณปิดเซสชันเริ่มต้น จากนั้นคุณสามารถเชื่อมต่อกับเซสชันที่กำลังดำเนินอยู่ได้อีกครั้งหากคุณลงชื่อเข้าใช้อีกครั้งเหมาะสำหรับการเรียกใช้การสำรองข้อมูล rsync เช่นเมื่อการซิงค์ต้องทำงานเป็นเวลานานและคุณไม่ต้องการปล่อยให้เซสชันของคุณทำงาน
DanteAlighieri

13

หากอยู่ในไดเร็กทอรีเดียวกับสคริปต์ของคุณที่มี:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

&ที่สิ้นสุดเป็นสิ่งที่ทำให้สคริปต์ของคุณทำงานในพื้นหลัง

> /dev/null 2>&1ส่วนหนึ่งไม่จำเป็น - มันเปลี่ยนเส้นทาง stdout และ stderr ลำธารเพื่อให้คุณไม่จำเป็นต้องเห็นพวกเขาในขั้วซึ่งคุณอาจต้องการที่จะทำสคริปต์ที่มีเสียงดังที่มีจำนวนมากของการส่งออก


7

เรียกใช้ใน subshell เพื่อลบการแจ้งเตือนและปิด STDOUT และ STDERR:

(&>/dev/null script.sh &)

นี่เป็นคำตอบเดียวที่ยังไม่พิมพ์บันทึกงานพื้นหลังเพื่อ[1] + 54765 done <emacs>ขอบคุณ
alper



0

ตัวอย่างเหล่านี้ใช้ได้ดี:

nohup sh prog.sh proglog.log 2> & 1 &

สำหรับการวนซ้ำคุณสามารถใช้สิ่งนี้:

สำหรับฉันใน {1..10}; ทำ sh prog.sh; นอน 1; ทำ prog.log 2> & 1 &

ทำงานในพื้นหลังและไม่แสดงผลลัพธ์ใด ๆ

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