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?


sumber
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.

wulong
sumber
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 &
vz0
sumber
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.

Nurul Akter Towhid
sumber
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)
Ganesh Krishnan
sumber
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

Pradeep Anchan
sumber