Nohup tidak menulis log ke file output


141

Saya menggunakan perintah berikut untuk menjalankan skrip python di latar belakang:

nohup ./cmd.py > cmd.log &

Tetapi tampaknya nohup tidak menulis apa pun ke file log. cmd.log dibuat tetapi selalu kosong. Dalam skrip python, saya menggunakan sys.stdout.writealih-alih printmencetak ke output standar. Apakah saya melakukan sesuatu yang salah?


Varian apa nohupyang Anda gunakan? Versi BSD menulis ke file yang disebut nohup.outdi direktori saat ini (atau $HOME/nohup.outjika direktori saat ini tidak dapat ditulisi). Saya tidak melihat cara untuk mengubah nama file output ...
— wulong

@wulong Itu hanya jika jika stdout adalah terminal.
— John Kugelman

Saya juga mencoba perintah tanpa pengalihan dan tidak membuat file nohup.out sama sekali. Saya tidak tahu varian yang mana tetapi saya menggunakan SunOS 5.10 jika itu membantu.

Jawaban:


103

Sepertinya Anda perlu menyiram stdout secara berkala (mis sys.stdout.flush().). Dalam pengujian saya, Python tidak secara otomatis melakukan ini bahkan dengan printsampai program keluar.


17
python serta program berbasis C stdio lainnya menggunakan line-buffering dalam kasus interaktif (stdout terhubung ke tty) dan blok-buffering ketika diarahkan ke file. Jika python -utidak berhasil; nohupmungkin telah memperkenalkan bufferingnya sendiri.
— jfs

12
@ JFSebastian Sampai hari ini, nohuptidak buffer output dan python -uberfungsi dengan baik. (hanya pembaruan untuk orang-orang)
— Pijusn

1
@Pius: nohupadalah utilitas POSIX mungkin ada implementasi yang berbeda pada platform yang berbeda. btw, python3 I / O tidak lagi berbasis C stdio tetapi memiliki perilaku buffering yang sama.
— jfs

381

Anda dapat menjalankan Python dengan -uflag untuk menghindari buffering output:

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

12
Ini lebih baik! Terima kasih banyak :)
— Sadjad

@ kommradHomer Saya kira itu tergantung pada jumlah output pada stdout / stderr yang dihasilkan oleh program Anda.
— vz0

1
Bekerja seperti pesona. Saya juga berpikir itu adalah jawaban yang lebih baik daripada yang dipilih sebagai yang benar. Bisakah Anda tandai ini sebagai benar untuk tidak membingungkan orang lain?
— Ondrej Burkert

1
Peringatan: tidak selalu berhasil . Saya tidak tahu kenapa. Apakah kamu?
— Basj

3
ini harus menjadi jawaban yang diterima ... melakukan apa yang saya inginkan. Terima kasih!
— krinker

42
  • Menggunakan -u dengan nohupbekerja untuk saya. Menggunakan -uakan memaksa stdout, stderrstream untuk tidak dibangun. Itu tidak akan mempengaruhi stdin. Semuanya akan disimpan dalam "file " nohup.out ". Seperti ini-

    nohup python -u your_code.py &

    Anda juga dapat menyimpannya di direktori Anda. Cara ini-

    nohup python -u your_code.py > your_directory/nohup.out &
  • Anda juga bisa menggunakannya PYTHONUNBUFFERED . Jika Anda mengaturnya ke string yang tidak kosong, itu akan berfungsi sama seperti -uopsi. Untuk menggunakan ini jalankan perintah di bawah ini sebelum menjalankan kode python.

    export PYTHONUNBUFFERED=1

    atau

    export PYTHONUNBUFFERED=TRUE

PS- Saya akan menyarankan menggunakan alat-alat seperti cron-job untuk menjalankan hal-hal di latar belakang dan eksekusi yang dijadwalkan.


Apa bedanya dengan jawaban dari @ vz0?
— Deqing

1
@Deqing tidak ada perbedaan.
— Overcode


2

Python 3.3 dan di atasnya memiliki argumen flush untuk dicetak dan ini adalah satu-satunya metode yang bekerja untuk saya.

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

0

Saya memiliki masalah serupa, tetapi tidak terhubung dengan proses Python. Saya menjalankan skrip yang melakukan nohup dan skrip berjalan secara berkala melalui cron.

Saya dapat menyelesaikan masalah dengan:

  1. mengarahkan stdin, stdout dan stderr
  2. memastikan skrip yang dipanggil melalui nohup tidak menjalankan apa pun di latar belakang

PS: skrip saya ditulis dalam ksh yang berjalan di RHEL

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.