当GNU并行退出时,我的程序也失败

当GNU并行退出时,我的程序也失败

我正在使用 GNUparallel来运行 bash 函数。该函数仅包含用于重新启动我的程序的 bash 脚本。起初,重新启动是可以的,但是当parallel退出时,我的程序也失败了。为什么?

#!/bin/bash

function_A () {
        local module=$1
        set -x
        cd /dir/${module}/;sh stop_${module}.sh;sh start_${module}.sh;sleep 10
}
export -f function_A

parallel --tag --onall --env function_A -S my_host function_A ::: my_program

ps输出:

root     12967  0.0  0.0  65960  1152 pts/1    Ss+  16:30   0:00 bash -c echo $SHELL | egrep "/t?csh" > /dev/null && echo CSH/TCSH DO NOT SUPPORT newlines IN VARIABLES/FUNCTIONS && exec false;? eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null  && echo setenv PARALLEL_SEQ 1\;  setenv PARALLEL_PID 6431  || echo PARALLEL_SEQ=1\;export PARALLEL_SEQ\;  PARALLEL_PID=6431\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && setenv function_A \(\)\ \{\ \ local\ module=\$1\;"?"\ set\ -x\;"?"\ cd\ /dir/\$\{module\}/\;"?"\ sh\ test.sh\;"?"\ sleep\ 10"?"\} || export function_A=\(\)\ \{\ \ local\ module=\$1\;"?"\ set\ -x\;"?"\ cd\ /dir/\$\{module\}/\;"?"\ sh\ test.sh\;"?"\ sleep\ 10"?"\} && eval function_A"$function_A";function_A my_program

答案1

据我了解你的问题,你想在远程计算机上启动一个守护进程,当 GNU Parallel 退出时,守护进程应该继续运行。

为此,您应该使用一个工具,即使在您注销后,该工具也允许命令继续执行。我知道 3 个这样的工具:

nohup
screen
tmux

因此,在您的函数中使用这些:

    cd /dir/${module}/;nohup sh stop_${module}.sh;nohup sh start_${module}.sh;sleep 10

答案2

尝试nohup sh "start_${module}.sh" &

#!/bin/bash

function_A () {
        local module=$1
        set -x
        cd "/dir/${module}/"
        sh "stop_${module}.sh"
        nohup sh "start_${module}.sh" &
        sleep 10
}
export -f function_A

parallel --tag --onall --env function_A -S my_host function_A ::: my_program

nohup命令将导致底层脚本在 shell 退出时(例如注销期间)不退出。 '&' 将立即将进程置于后台。另外,请确保您的"start_${module}.sh"工作是非交互式的;例如,尝试将其运行为sh -c 'sh start_${module}.sh') 以确保其有效。

相关内容