Nohup is not writing log to output file
Question:
I am using the following command to run a python script in the background:
nohup ./cmd.py > cmd.log &
But it appears that nohup is not writing anything to the log file. cmd.log is created but is always empty. In the python script, I am using sys.stdout.write
instead of print
to print to standard output. Am I doing anything wrong?
Answers:
It looks like you need to flush stdout periodically (e.g. sys.stdout.flush()
). In my testing Python doesn’t automatically do this even with print
until the program exits.
You can run Python with the -u
flag to avoid output buffering:
nohup python -u ./cmd.py > cmd.log &
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &
or
nohup python -u ./cmd.py > cmd.log &
-
Using -u
with nohup
worked for me. Using -u
will force the stdout
, stderr
streams to be unbuffered. It will not affect stdin. Everything will be saved in “nohup.out ” file. Like this-
nohup python -u your_code.py &
You can also save it into your directory. This way-
nohup python -u your_code.py > your_directory/nohup.out &
-
Also, you can use PYTHONUNBUFFERED
. If you set it to a non-empty string it will work same as the -u
option. For using this run below commands before running python code.
export PYTHONUNBUFFERED=1
or
export PYTHONUNBUFFERED=TRUE
P.S.- I will suggest using tools like cron-job to run things in the background and scheduled execution.
Python 3.3 and above has a flush argument to print and this is the only method that worked for me.
print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
I had a similar issue, but not connected with a Python process. I was running a script which did a nohup and the script ran periodically via cron.
I was able to resolve the problem by:
- redirecting the stdin , stdout and stderr
- ensuring the the script being invoked via nohup didn’t run anything else in the background
PS: my scripts were written in ksh running on RHEL
I run my scripts in the following way and I have no problem at all:
nohup python my_script.py &> my_script.out &
comparing with your syntax looks like you are only missing a "&" symbol after your input…
I am using the following command to run a python script in the background:
nohup ./cmd.py > cmd.log &
But it appears that nohup is not writing anything to the log file. cmd.log is created but is always empty. In the python script, I am using sys.stdout.write
instead of print
to print to standard output. Am I doing anything wrong?
It looks like you need to flush stdout periodically (e.g. sys.stdout.flush()
). In my testing Python doesn’t automatically do this even with print
until the program exits.
You can run Python with the -u
flag to avoid output buffering:
nohup python -u ./cmd.py > cmd.log &
export PYTHONUNBUFFERED=1
nohup ./cmd.py > cmd.log &
or
nohup python -u ./cmd.py > cmd.log &
-
Using
-u
withnohup
worked for me. Using-u
will force thestdout
,stderr
streams to be unbuffered. It will not affect stdin. Everything will be saved in “nohup.out ” file. Like this-nohup python -u your_code.py &
You can also save it into your directory. This way-
nohup python -u your_code.py > your_directory/nohup.out &
-
Also, you can use
PYTHONUNBUFFERED
. If you set it to a non-empty string it will work same as the-u
option. For using this run below commands before running python code.export PYTHONUNBUFFERED=1
or
export PYTHONUNBUFFERED=TRUE
P.S.- I will suggest using tools like cron-job to run things in the background and scheduled execution.
Python 3.3 and above has a flush argument to print and this is the only method that worked for me.
print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
I had a similar issue, but not connected with a Python process. I was running a script which did a nohup and the script ran periodically via cron.
I was able to resolve the problem by:
- redirecting the stdin , stdout and stderr
- ensuring the the script being invoked via nohup didn’t run anything else in the background
PS: my scripts were written in ksh running on RHEL
I run my scripts in the following way and I have no problem at all:
nohup python my_script.py &> my_script.out &
comparing with your syntax looks like you are only missing a "&" symbol after your input…