我有一个运行bash脚本的python代码main.py,bash脚本inturn提交一个作业(job)job.bash,并使用echo $JOBID | awk {'print $4'}获得其JOBID.如果我在终端中运行python,bash脚本可以工作,我可以获得并响应JOBID,如下所示:

#!/bin/bash 
JOBID=`sbatch ~/job.bash  | tee  output.log`
JOBID=`echo $JOBID | awk {'print $4'}`
echo $JOBID

上面作为python的一部分在终端python main.py中运行,但在终端nohup python main.py &中运行,echo不会打印或存储JOBID.

有什么原因吗?


我提交了slurm作业(job),因此JOBID是slurm的pid


(7月17日更新)看起来问题在于命令sbatch ~/job.bash | tee output.log,它没有使用nohup提交,因此JOBID永远不会被存储和 echo .

(7月18日更新)根据@pynexj在脚本结果中添加set -x的 comments :

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

这个问题仍然存在.似乎nohupsbatch不兼容.


问题:为什么nohup应该阻止提交slurm作业(job)?它的目标仅仅是捕捉终止信号?

推荐答案

如果此问题仅在nohup存在的情况下发生,您可以获得nohup的好处,而无需将其实际用于:

yourscript </dev/null >file.log 2>&1 & disown -h "$!"

这将执行以下操作:

  • 将stdin从/dev/null重定向到</dev/null
  • 将stdout和stderr重定向到包含>file.log 2>&1的日志(log)文件
  • 告诉shell不要使用disown -h "$!"将HUP信号转发到后台进程

...这就是nohup所做的一切.

Linux相关问答推荐

AddressSaniizer随机抛出没有任何解释的SIGSEGV

将十六进制文件名转换为十进制

bind() 错误 98 - 地址已在使用中

为什么我在从 Linux 通过 telnet 发送 Ctrl-C 后停止接收数据?

Ubuntu 20 不支持 MAP_FIXED_NOREPLACE

如何删除文件中不需要的字符(使用 shell 脚本)

使用 sed linux 命令和 i sed 命令进行 preprend 时的反向引用

为什么我的 Docker 进程不断在我的 Raspberry Pi 上重新启动?

获取变量中的当前路径并使用它

应用程序如何在运行时解析为不同版本的共享库?

Linux 应用程序分析

使用正则表达式时,Shell 'tar: not found in archive' 错误

grep 时间命令输出

在 Linux 上的进程之间传递消息的最快技术?

qstat 和长作业(job)名称

事件驱动和异步有什么区别?在 epoll 和 AIO 之间?

我可以使用 awk 将所有小写字母转换为大写吗?

后缀 - status=bounced(未知用户myuser)

Linux如何确定下一个PID?

在linux中将制表符分隔的文件转换为csv的最快方法