我正在使用 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'
) 以确保其有效。