Nohup çıktı dosyasına günlük yazmıyor


141

Arka planda bir python komut dosyası çalıştırmak için aşağıdaki komutu kullanıyorum:

nohup ./cmd.py > cmd.log &

Ancak görünen o ki nohup günlük dosyasına bir şey yazmıyor. cmd.log oluşturulur, ancak her zaman boştur. Python komut dosyasında, standart çıktıya yazdırmak sys.stdout.writeyerine kullanıyorum print. Yanlış bir şey mi yapıyorum?


Hangi varyantını nohupkullanıyorsunuz? BSD sürümü nohup.out, geçerli dizinde çağrılan bir dosyaya yazar (veya $HOME/nohup.outgeçerli dizin yazılabilir değilse). Çıktı dosya adını değiştirmenin bir yolunu görmüyorum ...
wulong

@wulong Bu sadece stdout bir terminal ise.
John Kugelman

Ayrıca yeniden yönlendirme olmadan komutu denedim ve nohup.out dosyasını hiç oluşturmadı. Hangi varyantı bilmiyorum ama bu yardımcı olursa SunOS 5.10 kullanıyorum.

Yanıtlar:


103

Stdoutu periyodik olarak yıkamanız gerekiyor gibi görünüyor (örn. sys.stdout.flush()). Testlerimde print, program çıkana kadar Python bunu otomatik olarak yapmaz .


17
python ve diğer C stdio tabanlı programlar etkileşimli durumda satır arabelleğe alma (stdout bir tty'ye bağlanır) ve bir dosyaya yönlendirildiğinde blok arabelleğe alma kullanır. Eğer python -uişe yaramazsa; nohupkendi arabelleklemesini başlatmış olabilir.
jfs

12
@JFSebastian Bugün itibariyle nohupçıktıyı arabelleğe almıyor ve python -ugayet iyi çalışıyor. (insanlar için sadece bir güncelleme)
Pijusn

1
@Pius: Farklı platformlarda farklı uygulamalar olabilen nohupbir POSIX yardımcı programıdır . btw, python3 G / Ç artık C stdio tabanlıdır, ancak benzer tamponlama davranışına sahiptir.
jfs

382

-uÇıktı tamponlamasını önlemek için Python'u bayrakla çalıştırabilirsiniz :

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

12
Bu daha iyi! Çok teşekkürler :)
Sadjad

@kommradHomer Sanırım programınızın ürettiği stdout / stderr çıktı miktarına bağlıdır.
vz0

1
Tıkır tıkır çalışıyor. Ben de bunun doğru olarak seçilenden daha iyi bir cevap olduğunu düşünüyorum. Başkalarını karıştırmamak için bunu doğru olarak işaretler misiniz?
Ondrej Burkert

1
Uyarı: her zaman çalışmaz . Nedenini bilmiyorum. Yapıyor musun?
Basj

3
bu kabul edilen cevap olmalı ... istediğimi yaptım. Teşekkürler!
krinker

42
  • Kullanımı -u ile nohupbenim için çalıştı. Kullanmak , akışları arabelleğe -ualınmaya zorlayacaktır . Stdin'i etkilemez. Her şey " nohup.out " dosyasına kaydedilir . Bunun gibi-stdoutstderr

    nohup python -u your_code.py &

    Ayrıca dizininize de kaydedebilirsiniz. Bu yoldan-

    nohup python -u your_code.py > your_directory/nohup.out &
  • Ayrıca kullanabilirsiniz PYTHONUNBUFFERED. Boş olmayan bir dizeye ayarlarsanız, -useçenekle aynı şekilde çalışır . Python kodunu çalıştırmadan önce aşağıdaki komutları çalıştırmak için.

    export PYTHONUNBUFFERED=1

    veya

    export PYTHONUNBUFFERED=TRUE

PS- Arka planda işleri ve programlanmış yürütmeyi çalıştırmak için cron-job gibi araçlar kullanmanızı öneririm.


@ Vz0 tarafından verilen yanıtla farkı nedir?
Deqing

1
@Deqing hiçbir fark yok.
Aşırıkoddan


2

Python 3.3 ve üstünün yazdırmak için floş argümanı vardır ve bu benim için çalışan tek yöntemdir.

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

0

Benzer bir sorunum vardı, ancak bir Python işlemi ile bağlantılı değil. Nohup yapan bir script çalıştırıyordum ve script periyodik olarak cron üzerinden koştu.

Sorunu şu şekilde çözebildim:

  1. stdin, stdout ve stderr'i yeniden yönlendirmek
  2. nohup aracılığıyla çağrılan komut dosyasının arka planda başka bir şey çalıştırmadığından emin olmak

Not: Senaryolarım RHEL üzerinde çalışan ksh ile yazılmıştır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.