杀死由 bash 脚本启动的中间人服务器?

杀死由 bash 脚本启动的中间人服务器?

我有一个 bash 脚本,如下所示:

bundle exec middleman server & node script.js && 
kill -9 $(lsof -i:4567 -t) &&
bundle exec middleman build --verbose

现在,我杀死bundle exec中间人服务器的方法是根据端口(localhost:4567)进行杀死。但是,如果端口需要更改(确实如此),这就不太好了。

运行 Node script.js 后终止 Bundle exec 中间人服务器的最佳方法是什么(它基本上等待服务器在线,发送 get 请求并对返回的服务器数据执行某些操作)。我想做一些不依赖于端口的事情,只是通过名称或第二个最近运行的东西(或最近运行的服务器?)来杀死它

非常感谢!

答案1

根据 shell 的不同,您应该能够轻松终止后台任务。如果您没有在后台运行任何其他内容,则这将是作业 1,因此您可以kill %1

sauer@host:~$ set -b
sauer@host:~$ sleep 10 & echo hello
[1] 18988
hello
sauer@host:~$ kill %1
[1]+  Terminated              sleep 10

如果后台可能还有其他事情,您可以做几件事。假设 Bash 或 shell 的工作方式类似,您可以使用jobs -r来获取正在运行的作业列表并 grep 出作业编号,也可以在 jobspec 中指定进程名称(百分比后面的内容)而不是数字。大概kill %bundle。或者,在这种情况下最有用的是,您可以用来%+引用最近的后台作业。

sauer@host:~$ set -b
sauer@host:~$ sleep 10 & sleep 11 & echo hello
[1] 19406
[2] 19407
hello
sauer@host:~$ kill %+
[2]+  Terminated              sleep 11

请注意,后台有两个睡眠进程正在运行,但这%+是“最近的”进程,因此它被杀死了。还set -b可以立即反馈后台作业状态,而不是等到下一个提示。这只是为了举例。 :)

哦,这里还有一个有用的示例,演示了按名称杀死后台任务,以及如果模式匹配多个进程会发生什么,因为它是主题的。请注意,“jobs”输出显示了最新和第二最近的作业的+和指示符,可用作作业规范中的简写。-

sauer@host:~$ sleep 10 & sleep 11 & sleep 9 & echo hello
[1] 22255
[2] 22256
[3] 22257
hello
sauer@host:~$ jobs
[1]   Running                 sleep 10 &
[2]-  Running                 sleep 11 &
[3]+  Running                 sleep 9 &
sauer@host:~$ kill %sleep
-bash: kill: sleep: ambiguous job spec
sauer@host:~$ kill %"sleep 10"
[1]   Terminated              sleep 10

相关内容