นำงาน nohup มาให้เบื้องหน้า


14

พิจารณาการnohupดำเนินการต่อไปนี้:

nohup script.sh > script.out &

มีวิธีออกจากระบบเทอร์มินัลเชื่อมต่อนำกระบวนการกลับมาทำงานเบื้องหน้าและโต้ตอบกับมันโดยใช้คีย์บอร์ดหรือไม่

คำตอบ:


7

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

tmux:

หน้าจอ:

แก้ไข: เพิ่มลิงค์สำหรับ tmux primers


+1 เครื่องมือที่ยอดเยี่ยมที่ฉันไม่รู้ ขอบคุณมาก.
Adam Matan

19

nohupไม่ได้ตัดการเชื่อมต่อคำสั่งจากเทอร์มินัลมันทำให้สคริปต์ของคุณเพิกเฉยSIGHUPและเปลี่ยนเส้นทางstdout/stderrไปยังไฟล์nohup.outเพื่อให้คำสั่งสามารถทำงานต่อในพื้นหลังหลังจากที่คุณออกจากระบบ

nohupไม่ทำให้คำสั่งนั้นทำงานโดยอัตโนมัติในพื้นหลัง &หนึ่งจะต้องทำอย่างนั้นอย่างชัดเจนโดยสิ้นสุดบรรทัดคำสั่งด้วย

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobsสามารถพิมพ์งานที่กำลังทำงานอยู่และสถานะของพวกเขา หากคำสั่งjobsไม่สามารถค้นหาได้แสดงว่าไม่มีกระบวนการย่อยของเชลล์นั้นอีกต่อไป

$ jobs 
[1]+  Running                 nohup ./script.sh &

หนึ่งสามารถนำกลับมางานพื้นหลังในเบื้องหน้าในทุบตีใช้แม้ว่าจะทำงานด้วยfg nohupแต่ที่จะไม่เปลี่ยนการเปลี่ยนเส้นทางการส่งออกซึ่งจะยังคงได้รับไปยังแฟ้มnohup.out

$ fg
nohup ./script.sh

หากคุณปิดเชลล์ / เทอร์มินัลหรือออกจากระบบคำสั่งของคุณจะไม่เป็นลูกของเชลล์นั้นอีกต่อไป มันเป็นinitกระบวนการ หากคุณค้นหาpstreeคุณจะเห็นว่าตอนนี้มันเป็นของกระบวนการ 1 ( init) สิ่งนั้นไม่สามารถนำกลับมาที่เบื้องหน้าได้เพราะพื้นหน้าไม่มีอยู่อีกต่อไป


If the command jobs cannot find it, then it is no longer a child process of that shell.สิ่งนี้ผิด: ลองลำดับนี้เพื่อดูว่า: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. หลังจากคำสั่งนี้คุณจะยังคงเห็นการsleepทำงานกับ PID เดียวกันที่พิมพ์ออกมาเมื่อคุณวางมันในขณะที่jobsจะพิมพ์อะไร วิธีเดียวที่กระบวนการของเด็กสามารถหยุดการเป็นเด็กกำลังสูญเสียผู้ปกครอง (จากนั้นเด็กกำพร้าจะกลายเป็นลูกของinit) หรือการตี + ออก (แต่จากนั้น PID จะเปลี่ยนดังนั้นจึงไม่ใช่เด็กคนแรก)
Ruslan

4

ฉันจะสองใช้เทอร์มินัลมัลติเพล็กเซอร์ แต่tmuxไม่ใช่หน้าจอ หน้าจอคือสำหรับสีและวัตถุประสงค์ทั้งหมด การกำหนดค่าของมันคือศิลปะมืดซึ่งน่าจะถูกบันทึกเป็นครั้งแรกในภาคผนวกของ Necronomicon ความพยายามที่จะเขียนการกำหนดค่าของคุณเองเป็นเหลือบของ Cthulu อย่างจริงจัง. มองไปรอบ ๆ ที่ผู้คนไฟล์ .screenrc เพื่อให้แน่ใจว่ามีวิธีที่จะไกล่เกลี่ยสิ่งที่น่ารังเกียจของหน้าจอ config flle Byobuทำงานได้อย่างน่าชื่นชมในฐานะที่เป็นม่านกั้นระหว่างผู้ใช้มรรตัยและรหัสที่ไม่บริสุทธิ์ มันมาพร้อมกับสีที่สมเหตุสมผลส่วนต่อประสานเมนูและที่สำคัญที่สุดคือแถบสถานะ

แต่อย่างที่ฉันบอกฉันแนะนำtmuxแทน มันยังคงต้องใช้การกำหนดค่าเล็กน้อย แต่มีการบันทึกไว้อย่างดีและไฟล์กำหนดค่าของคุณจะไม่ดูเหมือนคำพูดไร้สาระ นอกจากนี้คุณเริ่มด้วยสีและแถบสถานะ เปรียบเทียบไฟล์ screenrc และ tmux.conf ของฉัน:


0

หากคุณสนใจที่จะมองหาหมวกถ่ายทอดสดผลลัพธ์นี้อาจเหมาะกับคุณ:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0

คำสั่ง Linux ใด ๆ สามารถส่งไปยังพื้นหลังด้วย ' &' ต่อท้ายในที่สุด

ในการดูงานพื้นหลังทั้งหมดคุณสามารถออก jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

ที่นี่ฉันทำงาน 3 งานในพื้นหลัง: zookeeper, kafka และ mongo daemon [1], [2] และ [3] เป็นหมายเลขงานตามลำดับสำหรับงานเหล่านี้

คุณสามารถนำงานเหล่านั้นมาทำงานเบื้องหน้าได้ fg %$taskNumber.

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