เปลี่ยนเส้นทาง nohup ไปยัง stdout


14

เป็นไปได้ไหมที่จะให้กระบวนการเริ่มต้นด้วย nohup เขียนไปยัง stdout แทนที่จะเป็นไฟล์? หรืออาจจะเป็นในไฟล์และบนหน้าจอ?

nohup python start.py &

เขียนถึงnohup.outแต่ฉันต้องการให้มันส่งออกไปยังหน้าจอ nohup มีความหมายเฉพาะเป็นการป้องกันความเสี่ยงเมื่อการเชื่อมต่อแบ่ง


แต่จะเกิดอะไรขึ้นเมื่อโปรแกรมของคุณแสดงผลหลังจากหยุดการเชื่อมต่อ
womble

คำตอบ:


4
  1. nohup python start.py & tail -f nohup.outtail -fจะถูกฆ่าตายและเริ่มต้นใหม่ที่จะ

  2. screen python start.py และเลิกเชื่อมต่ออีกครั้งตามต้องการ


10

จากman nohup:

หากอินพุตมาตรฐานคือเทอร์มินัลให้เปลี่ยนเส้นทางจาก / dev / null ถ้าออกมาตรฐานเป็นขั้วผนวกส่งออกไป nohup.out ถ้าเป็นไปได้$HOME/nohup.outมิฉะนั้น หากข้อผิดพลาดมาตรฐานคือเทอร์มินัลให้เปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐาน nohup COMMAND > FILEในการบันทึกการส่งออกไปยังไฟล์ที่ใช้

(แก้ไขอย่างสมบูรณ์ตามความคิดเห็น)
เมื่อออกจากเชลล์หรือปิดเทอร์มินัลกระบวนการลูกจะถูกส่ง SIGHUP (hangup ชื่อมาจากเวลาที่เทอร์มินัลจะโทรเข้าคอมพิวเตอร์ UNIX) เพื่อบอกพวกเขาว่าเทอร์มินัลนั้นไม่มี เชื่อมต่ออีกต่อไป นอกจากนี้เมื่อกระบวนการเชลล์สิ้นสุดลงสตรีม stdin, stdout และ stderr ของกระบวนการเด็กจะถูกปิด โดยปกติสิ่งนี้ทำให้กระบวนการเด็กตาย โดยปกติแล้วสิ่งนี้เป็นสิ่งที่ดีเพราะจะช่วยให้กระบวนการไม่ทำงานโดยไม่มีผู้ใช้

วัตถุประสงค์ของnohupโปรแกรมคือการทำให้กระบวนการทำงานต่อไปแม้หลังจากที่เชลล์ยกเลิกและเทอร์มินัลยกเลิกการเชื่อมต่อ เช่นนี้การควบคุมทิศทางเอาต์พุตไปยังเทอร์มินัลก็เอาชนะวัตถุประสงค์อย่างสมบูรณ์ คำตอบดั้งเดิมของฉัน ( nohup COMMAND | cat) ไม่เป็นประโยชน์เพราะ: เมื่อปิดเทอร์มินัลเอาต์พุตของแมวจะปิดและแมวก็ตายซึ่งแบ่งท่อและส่ง SIGPIPE ไปยังกระบวนการ nohup ทำให้มันตาย ฉันตอบคำถามโดยไม่คิดถึงจุดประสงค์

เพื่อให้บรรลุวัตถุประสงค์ของคุณให้เรียกใช้nohup COMMAND > FILEเพื่อเลือกชื่อของไฟล์เพื่อส่งออกโดยตรง จากนั้นใช้tail -f FILEเพื่อดูผลลัพธ์บนเทอร์มินัล

ในทำนองเดียวกันเราสามารถใช้COMMAND >FILE 2>&1 </dev/null &คำสั่งshell ต่อไปนี้เพื่อรันคำสั่งที่ stdio stream ไม่ได้เชื่อมต่อกับเทอร์มินัลและสามารถทำงานต่อหลังจากปิดเทอร์มินัลแล้ว นอกจากนี้ใน zsh ให้รัน shell-builtin disownเพื่อบอก zsh ให้ออกจากกระบวนการแทนที่จะฆ่ามันเมื่อเชลล์สิ้นสุด


1
การเพิ่มที่ดีอย่างหนึ่ง: หากคำสั่ง nohup เริ่มต้นด้วยชื่อไฟล์คุณสามารถใช้tail -f filenameเพื่อดูสิ่งที่เขียนไปยังไฟล์
Hennes

ไม่ทำงานเมื่อการเชื่อมต่อหยุดไฟล์จะไม่ถูกเขียนอีกต่อไป
Davoud Taghawi-Nejad

คุณพูดถูก: ฉันตอบคำถาม (ส่งเอาต์พุตไปยังเทอร์มินัล) แต่แพ้จุดประสงค์ ฉันเขียนคำตอบของฉันอีกครั้ง
dsh

-1
vladimir@lin-mint-cin:~$ tty<br>
/dev/pts/8<br>
vladimir@lin-mint-cin:~$ ln -sf /dev/pts/8 nohup.out<br>
vladimir@lin-mint-cin:~$ nohup ls<br>
nohup: ввод игнорируется, вывод добавляется в 'nohup.out'<br>
2019-05-31-090159.jpg    giphy.gif        nim_porojects   sketchbook
Aptana_Studio_Workspace  IdeaProjects         nohup.out       target
Desktop          jack_capture_01.wav  Pictures        Templates
Documents        lib              Postman         tmp
Downloads        mad              Projects        trace.edn
eclipse          Mail             prolog_ws       uinfild_hill-iskusstvo_shemotehniki_tom_1_izd4-e-1489315100.pdf
eclipse-dsl-workspace    Music            proxy-secret    Videos
eclipse-workspace    mygolo           Public          workspace-dltk
erlang_ex        my_golo_ws       rust-workspace  проекты
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.