Nohup ไม่ได้เขียนบันทึกไปยังไฟล์ที่ส่งออก


141

ฉันใช้คำสั่งต่อไปนี้เพื่อเรียกใช้สคริปต์หลามในพื้นหลัง:

nohup ./cmd.py > cmd.log &

แต่ปรากฏว่า nohup ไม่ได้เขียนอะไรลงล็อกไฟล์ cmd.log ถูกสร้าง แต่ว่างเปล่าเสมอ ในสคริปต์ python ฉันใช้sys.stdout.writeแทนprintการพิมพ์ไปยังเอาต์พุตมาตรฐาน ฉันกำลังทำอะไรผิดหรือเปล่า?


ซึ่งแตกต่างจากnohupที่คุณใช้? เวอร์ชัน BSD เขียนไปยังไฟล์ที่เรียกว่าnohup.outในไดเรกทอรีปัจจุบัน (หรือ$HOME/nohup.outถ้าไดเรกทอรีปัจจุบันไม่สามารถเขียนได้) ฉันไม่เห็นวิธีที่จะเปลี่ยนชื่อไฟล์เอาต์พุต ...
wulong

@ อูหลงนั่นก็ต่อเมื่อ stdout เป็นเทอร์มินัล
John Kugelman

ฉันลองใช้คำสั่งโดยไม่เปลี่ยนเส้นทางและไม่ได้สร้างไฟล์ nohup.out เลย ฉันไม่ทราบว่าเป็นรุ่นใด แต่ฉันใช้ SunOS 5.10 ถ้าช่วยได้

คำตอบ:


103

ดูเหมือนว่าคุณจะต้องล้างข้อมูลออกเป็นระยะ (เช่นsys.stdout.flush()) ในการทดสอบของฉัน Python จะไม่ทำสิ่งนี้โดยอัตโนมัติแม้กระทั่งprintจนกว่าโปรแกรมจะออก


17
python เช่นเดียวกับโปรแกรมที่ใช้ C stdio อื่น ๆ ใช้ line-buffering ในกรณีการโต้ตอบ (stdout เชื่อมต่อกับ tty) และ block-buffering เมื่อเปลี่ยนเส้นทางไปยังไฟล์ ถ้าpython -uไม่ทำงาน nohupอาจแนะนำการบัฟเฟอร์ของตัวเอง
jfs

12
@JFSebastian ณ วันนี้nohupไม่ได้บัฟเฟอร์เอาต์พุตและpython -uทำงานได้ดี (แค่อัปเดตสำหรับผู้คน)
Pijusn

1
@Pius: nohupเป็นยูทิลิตี้ POSIXอาจมีการใช้งานที่แตกต่างกันบนแพลตฟอร์มที่แตกต่างกัน btw, python3 I / O ไม่ใช่ C stdio-based อีกต่อไป แต่มันมีพฤติกรรมการบัฟเฟอร์ที่คล้ายกัน
jfs

382

คุณสามารถเรียกใช้ Python ด้วยการ-uตั้งค่าสถานะเพื่อหลีกเลี่ยงการบัฟเฟอร์ผลลัพธ์:

nohup python -u ./cmd.py > cmd.log &

12
มันดีกว่า! ขอบคุณมาก :)
Sadjad

@ kommradHomer ฉันคิดว่ามันขึ้นอยู่กับปริมาณของเอาต์พุตใน stdout / stderr ที่โปรแกรมของคุณสร้าง
vz0

1
ทำงานเหมือนจับใจ ฉันคิดว่ามันเป็นคำตอบที่ดีกว่าคำตอบที่ถูกต้อง คุณช่วยทำเครื่องหมายสิ่งนี้ให้ถูกต้องเพื่อไม่ให้คนอื่นสับสนได้ไหม
Ondrej Burkert

1
คำเตือน: มันไม่ได้ผลเสมอไป ฉันไม่รู้ว่าทำไม คุณ
Basj

3
นี่ควรเป็นคำตอบที่ยอมรับ ... ทำในสิ่งที่ฉันต้องการ ขอบคุณ!
krinker

42
  • ใช้-u กับnohupทำงานสำหรับฉัน การใช้-uจะบังคับstdout, stderrลำธารจะเป็นบัฟเฟอร์ มันจะไม่ส่งผลกระทบต่อ stdin ทุกอย่างจะถูกบันทึกในไฟล์ " nohup.out " แบบนี้-

    nohup python -u your_code.py &

    คุณยังสามารถบันทึกลงในไดเรกทอรีของคุณ ทางนี้-

    nohup python -u your_code.py > your_directory/nohup.out &
  • PYTHONUNBUFFEREDนอกจากนี้คุณยังสามารถใช้ หากคุณตั้งค่าเป็นสตริงที่ไม่ว่างเปล่ามันจะทำงานเหมือนกับ-uตัวเลือก สำหรับการใช้คำสั่งเรียกใช้ด้านล่างนี้ก่อนใช้รหัสไพ ธ อน

    export PYTHONUNBUFFERED=1

    หรือ

    export PYTHONUNBUFFERED=TRUE

PS- ฉันจะแนะนำให้ใช้เครื่องมือเช่น cron-job เพื่อเรียกใช้สิ่งต่าง ๆ ในพื้นหลังและการดำเนินการตามกำหนดการ


ความแตกต่างกับคำตอบจาก @ vz0 คืออะไร
Deqing

1
@ Deqing ไม่มีความแตกต่าง
Overcode


2

Python 3.3 และสูงกว่ามีอาร์กิวเมนต์ฟลัชที่จะพิมพ์และนี่เป็นวิธีเดียวที่เหมาะกับฉัน

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)

0

ฉันมีปัญหาที่คล้ายกัน แต่ไม่ได้เชื่อมต่อกับกระบวนการ Python ฉันกำลังเรียกใช้สคริปต์ที่ไม่มีการเร่งความเร็วและสคริปต์จะทำงานเป็นระยะ ๆ ผ่าน cron

ฉันสามารถแก้ไขปัญหาโดย:

  1. เปลี่ยนเส้นทาง stdin, stdout และ stderr
  2. การทำให้แน่ใจว่าสคริปต์ที่ถูกเรียกใช้ผ่าน nohup ไม่ได้ทำงานอย่างอื่นในพื้นหลัง

PS: สคริปต์ของฉันเขียนเป็น ksh ที่ทำงานบน RHEL

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