我编写了一个 bash 脚本来在后台运行服务并从脚本退出到命令行。但是在运行 eval 命令后,控制不会转到下一条语句。
COMMAND="nohup java -jar jenkins.war"
echo "starting service"
eval $COMMAND
echo "service running"
exit
echo "service running" 并退出永远不会发生。我想在后台运行该进程,并在服务仍在运行时返回命令提示符。我该怎么做呢?
我编写了一个 bash 脚本来在后台运行服务并从脚本退出到命令行。但是在运行 eval 命令后,控制不会转到下一条语句。
COMMAND="nohup java -jar jenkins.war"
echo "starting service"
eval $COMMAND
echo "service running"
exit
echo "service running" 并退出永远不会发生。我想在后台运行该进程,并在服务仍在运行时返回命令提示符。我该怎么做呢?
请不要将带有参数的命令放在string中。将您的命令及其参数放在一个数组中(并且不要使用大写的变量名,这是一种非常糟糕的做法),并且不要使用eval
. eval
是邪恶的!
command=( nohup java -jar jenkins.war )
echo "starting service"
"${command[@]}" 2> /dev/null &
echo "service running"
&
就是让命令在后台运行。
尝试:
command="java -jar jenkins.war"
echo "starting service"
$command </dev/null >jenkins.out 2>jenkins.err &
echo "service running"
在调用末尾添加一个 & 符号:
eval $COMMAND &
eval 不能解决这个问题,你需要'run-in-background' 字符,即'&'(没有引号)。
将您的行重写为
#eval $COMMAND
$COMMAND &
根据您在 $COMMAND 中真正拥有的其他内容,您可能需要放回eval
后面。
此外,根据您的需要,在后台运行进程会产生一些jobs
输出,即
[1] 10079
到控制台的标准错误。您需要一些额外的语法将其重定向到 /dev/null。这是一个例子:
COMMAND="sleep 10"
{ $COMMAND & ; } 1>/dev/null 2>&1
使用进程组(不{ .... ; }
应该引起任何问题,但它可能会。
IHTH