- 此问题在此处已有答案**:
How to get the process ID to kill a nohup process?(16个答案)
3小时前关门了。
我已经写了调用python代码的shell脚本。python代码通过nohup
执行。
当python代码从nohup stdbuf -oL python3 -u pid_ watch.py > log.txt 2>&1 &
终端执行时,它返回[1] 2128
输出,返回进程id。
但是当从shell脚本执行相同的命令时,它返回空字符串。
#!/bin/bash
#export arguments=${@}
filepath=""
username=""
while getopts 'v:u:' OPT; do
case "$OPT" in
v) filepath=$OPTARG;;
u) username=$OPTARG;;
esac
done
program_log="$(dirname "$filepath")/$(basename "$filepath" .py)_"$username".log"
output=`nohup stdbuf -oL python3 -u "$filepath" > "$program_log" 2>&1 &`
echo "${output}"
这里的输出是空字符串,但是当ps -ef
完成时,它显示了一个python进程,它是从那个程序开始的。
如何解决这个问题,以便在输出变量中从nohup获取进程ID?
2条答案
按热度按时间hgc7kmma1#
根据定义,nohup将捕获nohup.out中的所有输出(stdout和stderr)。
您将需要像这样使用stdbuf:
实际上,输出将永远不会得到PID。
与
dkqlctbz2#
nohup * 根本不 * 将进程ID写入输出,而是shell(不是nohup、stdbuf或python)写入您看到的内容,但它不通过stdout,因此不能用命令替换捕获;而且在没有打开作业控制的情况下,它根本不会写入shell,这些特性在脚本中默认是禁用的。
要收集已启动程序的PID,只需使用
$!
...将PID存储在变量
$pid
中。