9

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

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

echo "service running" 并退出永远不会发生。我想在后台运行该进程,并在服务仍在运行时返回命令提示符。我该怎么做呢?

4

4 回答 4

15

请不要将带有参数的命令放在string中。将您的命令及其参数放在一个数组中(并且不要使用大写的变量名,这是一种非常糟糕的做法),并且不要使用eval. eval是邪恶的!

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

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

于 2012-12-27T22:08:56.080 回答
3

尝试:

command="java -jar jenkins.war"
echo "starting service"
$command </dev/null >jenkins.out 2>jenkins.err &
echo "service running"
于 2012-12-27T22:32:52.697 回答
3

在调用末尾添加一个 & 符号:

eval $COMMAND &
于 2012-12-27T22:07:24.317 回答
2

eval 不能解决这个问题,你需要'run-in-background' 字符,即'&'(没有引号)。

将您的行重写为

 #eval $COMMAND
 $COMMAND &

根据您在 $COMMAND 中真正拥有的其他内容,您可能需要放回eval后面。

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

[1]     10079

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

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

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

IHTH

于 2012-12-27T22:05:26.807 回答