I have a python code main.py that runs bash script, the bash script inturn submits a job job.bash and obtains its JOBID using echo $JOBID | awk {'print $4'}. If I run python in the terminal, the bash script works and I am able to obtain and echo the JOBID as follows:
#!/bin/bash
JOBID=`sbatch ~/job.bash | tee output.log`
JOBID=`echo $JOBID | awk {'print $4'}`
echo $JOBID
Running above as part of python works in terminal python main.py, but doing nohup python main.py &, the echo does not print or store JOBID.
Any reason for this?
I am submitting a slurm job hence the JOBID is the pid from slurm
(Update Jul 17) Looks like the issue is with the command sbatch ~/job.bash | tee output.log, it doesnt get submitted using nohup and hence JOBID never gets stored and echo'd.
(Update Jul 18) As per the comments from @pynexj adding set -x in the script results:
nohup: ignoring input and redirecting stderr to stdout
date
Mon Jul 18 21:46:35 03 2022
sbatch ~/job.bash
tee output.log
JOBID=
echo
awk '{print $4}'
JOBID=
echo
The issue still persists. It appears that nohup is incompatible with sbatch.
Question: Why should nohup prevent submission of slurm job? Its objective is merely to capture terminate signal?
CodePudding user response:
If this problem only happens with nohup present, you can get the benefits of nohup without actually using it with:
yourscript </dev/null >file.log 2>&1 & disown -h "$!"
This does the following:
- Redirects stdin from
/dev/nullwith</dev/null - Redirects stdout and stderr to a log file with
>file.log 2>&1 - Tells the shell not to forward HUP signals to the background process with
disown -h "$!"
...which is everything nohup does.
