我编写了一个bash脚本来在后台运行服务并从脚本退出到命令行。但是在运行eval命令之后,控件不会进入下一个语句。
COMMAND="nohup java -jar jenkins.war"
echo "starting service"
eval $COMMAND
echo "service running"
exit
回显“服务正在运行”并且退出永远不会发生。我想在后台运行该进程,并在服务仍在运行时返回到命令提示符。我该怎么做?
答案 0 :(得分:12)
请不要将带有参数的命令放在字符串中。将您的命令及其参数放在数组中(并且不要使用大写的变量名,这是非常糟糕的做法),不要使用eval
。 eval
是邪恶的!
command=( nohup java -jar jenkins.war )
echo "starting service"
"${command[@]}" 2> /dev/null &
echo "service running"
&
是让命令在后台运行。
答案 1 :(得分:3)
尝试:
command="java -jar jenkins.war"
echo "starting service"
$command </dev/null >jenkins.out 2>jenkins.err &
echo "service running"
答案 2 :(得分:2)
将您的行重写为
#eval $COMMAND
$COMMAND &
根据您在$ COMMAND中的其他内容,您可能需要重新设置eval
。
此外,根据您的需要,在后台运行流程会产生一些jobs
输出,即
[1] 10079
到控制台的std-error。您需要一些额外的语法将其重定向到/ dev / null。这是一个例子:
COMMAND="sleep 10"
{ $COMMAND & ; } 1>/dev/null 2>&1
使用流程组({ .... ; }
不应该导致任何问题,但可能会出现问题。
IHTH
答案 3 :(得分:2)
在通话结束时添加&符号:
eval $COMMAND &