Używam następującego polecenia, aby uruchomić skrypt Pythona w tle:
nohup ./cmd.py > cmd.log &
Wygląda jednak na to, że nohup nic nie zapisuje do pliku dziennika. cmd.log jest tworzony, ale zawsze jest pusty. W skrypcie Pythona używam sys.stdout.write
zamiast print
drukowania na standardowe wyjście. Czy robię coś złego?
nohup
Z jakiego wariantu korzystasz? Wersja BSD zapisuje do pliku wywołanegonohup.out
w bieżącym katalogu (lub$HOME/nohup.out
jeśli bieżący katalog nie jest zapisywalny). Nie widzę sposobu na zmianę nazwy pliku wyjściowego ...Odpowiedzi:
Wygląda na to, że musisz okresowo opróżniać stdout (np
sys.stdout.flush()
.). W moich testach Python nie robi tego automatycznie, nawetprint
dopóki program nie zakończy działania.źródło
python -u
nie działa;nohup
mógł wprowadzić własne buforowanie.nohup
nie buforuje wyjścia ipython -u
działa dobrze. (tylko aktualizacja dla ludzi)nohup
to narzędzie POSIX, które może mieć różne implementacje na różnych platformach. btw, I / O python3 nie jest już oparte na C stdio, ale ma podobne zachowanie buforowania.Możesz uruchomić Pythona z
-u
flagą, aby uniknąć buforowania wyjścia:źródło
Używanie
-u
znohup
zadziałało dla mnie. Korzystanie-u
zmusistdout
,stderr
strumieni być buforowane. Nie wpłynie to na stdin. Wszystko zostanie zapisane w pliku „ nohup.out ”. Lubię to-Możesz również zapisać go w swoim katalogu. Tą drogą-
Możesz także użyć
PYTHONUNBUFFERED
. Jeśli ustawisz go na niepusty ciąg, będzie działać tak samo, jak-u
opcja. Aby użyć tego, uruchom poniższe polecenia przed uruchomieniem kodu Pythona.lub
PS : Zasugeruję użycie narzędzi takich jak cron-job do uruchamiania rzeczy w tle i wykonywania zaplanowanych.
źródło
lub
https://docs.python.org/2/using/cmdline.html#cmdoption-u
źródło
Python 3.3 i nowsze wersje mają argument flush do wydrukowania i jest to jedyna metoda, która działała dla mnie.
źródło
Miałem podobny problem, ale nie był związany z procesem w Pythonie. Uruchomiłem skrypt, który wykonał nohup, a skrypt był uruchamiany okresowo przez cron.
Udało mi się rozwiązać problem poprzez:
PS: moje skrypty zostały napisane w ksh działającym na RHEL
źródło