获取shell脚本中nohup变量的输出[重复]

exdqitrt  于 2023-02-24  发布在  Shell
关注(0)|答案(2)|浏览(198)
    • 此问题在此处已有答案**:

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?

hgc7kmma

hgc7kmma1#

根据定义,nohup将捕获nohup.out中的所有输出(stdout和stderr)。
您将需要像这样使用stdbuf:

#!/bin/bash
echo $$ >$0.pid
...{your script logic}...

实际上,输出将永远不会得到PID。

nohup stdbuf -oL python3 -u "$filepath" > "$program_log" 2>&1 &

read PID <$0.pid
dkqlctbz

dkqlctbz2#

nohup * 根本不 * 将进程ID写入输出,而是shell(不是nohup、stdbuf或python)写入您看到的内容,但它不通过stdout,因此不能用命令替换捕获;而且在没有打开作业控制的情况下,它根本不会写入shell,这些特性在脚本中默认是禁用的。
要收集已启动程序的PID,只需使用$!

nohup stdbuf -oL python3 -u "$filepath" > "$program_log" 2>&1 & pid=$!

...将PID存储在变量$pid中。

相关问题