【问题标题】:Start a process in background, do a task, then kill the process in the background在后台启动进程,执行任务,然后在后台终止进程
【发布时间】:2015-05-11 14:57:27
【问题描述】:

我有一个如下所示的脚本:

pushd .
nohup java -jar test/selenium-server.jar > /dev/null 2>&1 &
cd web/code/protected/tests/
phpunit functional/
popd

硒服务器需要运行以进行测试,但是在 phpunit 命令完成后,我想终止正在运行的硒服务器。

我该怎么做?

【问题讨论】:

  • @isalgueiro 如果它们是在后台运行的其他进程怎么办?
  • %1 代表“第一个后台作业”,您的脚本只将一个进程发送到后台tldp.org/LDP/abs/html/x9644.html
  • @isalgueiro 是的,但是如果运行脚本的人在运行此脚本之前已经在终端中运行了后台进程怎么办?
  • 我不认为脚本在同一个 shell 实例上运行。无论如何,如果您不想依赖作业编号(即%1),您可以在运行 nohup 后保存$! 并通过 PID 终止进程。
  • 那么最好的选择是运行kill %-,这将杀死最后一个工作

标签: bash command-line-interface


【解决方案1】:

你可能可以将进程的PID保存在一个变量中,然后使用kill命令杀死它。

pushd .
nohup java -jar test/selenium-server.jar > /dev/null 2>&1 &
serverPID=$!
cd web/code/protected/tests/
phpunit functional/
kill $serverPID
popd

我自己没有测试过,我想写在评论上,但还没有足够的声誉:)

【讨论】:

    【解决方案2】:

    当脚本被执行时,一个新的 shell 实例被创建。这意味着新脚本中的 jobs 不会列出在父 shell 中运行的任何作业。

    由于selenium-server 服务器是在新脚本中创建的唯一后台进程,因此可以使用它来杀死它

    #The first job 
    kill %1
    

    或者

    #The last job Same as the first one
    kill %-
    

    【讨论】:

      【解决方案3】:

      只要您不在后台启动任何其他进程(您没有启动),您就可以使用 $!直接:

      pushd .
      nohup java -jar test/selenium-server.jar > /dev/null 2>&1 &
      cd web/code/protected/tests/
      phpunit functional/
      kill $!
      popd
      

      【讨论】: