我正在 Bash 脚本中启动两个进程:
运行网络服务器
xdg-open http://$(主机名)/dev-environment
run_webserver 是一个正在进行的进程,所以我需要能够使用 ctrl-c 来终止它。xdg-open 命令只是在浏览器中启动一个页面。如果我用 & 符号分隔这些命令,第二个进程会从第一个进程中夺走“焦点”,我无法再使用 ctrl+c 来终止它……而必须查找并运行ps
。kill -9
有什么想法吗?
答案1
&(& 符号)将进程发送到后台。这意味着如果您运行“run_webserver &”,则该进程将在后台运行。
您可以通过查看终端中该进程的作业 ID 将此进程带到前台。
将进程带到前台并终止的步骤
jobs:--> 此命令将列出终端上正在运行的所有进程。
fg:-->此命令将把进程带到前台。
然后您可以使用 ctrl-c 来终止该进程,或者使用任何其他可以终止该进程的序列。
请参阅附件的屏幕截图:-
答案2
可以设置一个陷阱,在退出时杀死后台进程,并等待后台进程。
#!/bin/bash
trap 'kill $!' EXIT
run_webserver &
xdg-open "http://$HOSTNAME/dev-environment"
wait
或者,在后台运行其他命令
#!/bin/bash
xdg-open "http://$HOSTNAME/dev-environment" &
run_webserver
答案3
fg
将会把最近的进程返回到前台。fg -
将会把倒数第二个进程返回到前台。
此外,您只能kill -9
在所有其他方法都失败后才将其用作最后的手段,因为 SIGKILL (-9) 不允许程序在退出前进行任何清理。首先,直接发送kill
,这相当于kill -TERM
。如果等待一段时间后失败,请发送 SIGHUP: kill -HUP
。只有在这些信号失败后,您才应该尝试 SIGKILL。