【问题标题】:control to the next statement after running eval command运行 eval 命令后控制到下一条语句
【发布时间】:2012-12-28 11:28:39
【问题描述】:

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

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

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

【问题讨论】:

  • 感谢所有回答问题并帮助我的人! :-)

标签: bash


【解决方案1】:

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

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

& 是让命令在后台运行。

【讨论】:

  • 感谢它的工作。我有一个子问题。现在它在回显“服务正在运行”后返回命令提示符,但它显示“nohup:将输出附加到'nohup.out'并且在我按下 ctrl+c 之前不会返回命令提示符。我怎样才能让它直接进入命令提示符不按 ctrl+c?我不介意将输出保存到任何文件名,但在我杀死它之前,该进程不应停止。
  • @user1164061 您不必按 Ctrl+C,只需按 Enter。我已经编辑了我的帖子,这样你就不会收到烦人的消息了。
  • @gniourf_gniourf ,第二次通过Jenkins执行脚本时同样不起作用。请帮我解决这个问题。
  • @Swetha:信息这么少,我帮不了你;也许您可以打开一个新问题,在其中添加我们帮助您解决问题所需的所有信息……
【解决方案2】:

在通话末尾添加一个 & 符号:

eval $COMMAND &

【讨论】:

    【解决方案3】:

    试试:

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

    【讨论】:

      【解决方案4】:

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

      将你的行改写为

       #eval $COMMAND
       $COMMAND &
      

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

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

      [1]     10079
      

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

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

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

      IHTH

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 1970-01-01
        • 2018-03-04
        • 2019-09-07
        • 2017-11-16
        相关资源
        最近更新 更多