2012-12-27 30 views
6

我已经编写了一个bash脚本来在后台运行服务并从脚本退出到命令行。但是在运行eval命令后,控制不会执行下一条语句。在运行eval命令后控制下一个语句

COMMAND="nohup java -jar jenkins.war" 
echo "starting service" 
eval $COMMAND 
echo "service running" 
exit 

回声“服务运行”并退出从不发生。我想在后台运行该进程,并在服务仍在运行时返回到命令提示符。我该怎么做呢?

+0

谢谢大家谁回答了这个问题,并帮助我! :-) – user1164061

回答

11

请不要在字符串中输入其参数的命令。将您的命令及其参数置于数组(并且不使用大写变量名称,这是非常糟糕的做法),并且不使用evaleval是邪恶的!

command=(nohup java -jar jenkins.war) 
echo "starting service" 
"${command[@]}" 2> /dev/null & 
echo "service running" 

&是让该命令在后台运行。

+0

感谢它的工作。我有一个子问题。现在,在回显“服务运行”后,它返回到命令提示符,但它显示“nohup:将输出追加到'nohup.out',并且在我按下ctrl + c之前不会返回到命令提示符。我如何直接进入命令提示符没有按ctrl + c?我不介意保存输出到任何文件名,但过程不应该停止任何时间,直到我杀了它 – user1164061

+0

@ user1164061你不必按Ctrl + C,只需按Enter键。编辑我的文章,这样你就不会有恼人的信息 –

+0

对于'eval'注释+1,''$ {command [@]} +10“ – l0b0

1

eval不能解决这个问题,您需要'后台运行'字符,即'&'(不含引号)。

重写你行

#eval $COMMAND 
$COMMAND & 

根据还有什么你真的在$ COMMAND,你可能需要把eval回来。

另外,根据您的需要,在后台运行的过程中会产生一些jobs输出,即

[1]  10079 

到控制台的STD-错误。您需要一些额外的语法将其重定向到/ dev/null。这里有一个例子:

COMMAND="sleep 10" 
{ $COMMAND & ; } 1>/dev/null 2>&1 

使用过程组({ .... ; }应该不会引起任何问题,但它可能

IHTH

2

的符号添加到通话结束。

eval $COMMAND & 
3

尝试:

command="java -jar jenkins.war" 
echo "starting service" 
$command </dev/null >jenkins.out 2>jenkins.err & 
echo "service running" 
相关问题