如何在bash中停止一个后台进程,使其在下一个命令完成后停止?

3

如果我关闭Firefox窗口或以某种方式停止此脚本,我该如何管理morbo服务器(在此称为后台进程)自动关闭/终止?

#!/bin/bash

morbo Mojolicious_Lite.pl &

firefox -new-window http://localhost:3000/
3个回答

7

好的,让我们解决这个问题。

#!/bin/bash
morbo Mojolicious_Lite.pl & P=$!
trap "kill $P" INT # maybe you want EXIT here too?
firefox -new-window http://localhost:3000/
wait

这个应该能行... 当Firefox退出时,shell会等待剩余的作业(morbo),然后可以通过Ctrl-C中断它们 - 在这种情况下,陷阱将杀死它们。
你可以通过以下方式进行可视化测试(即查看执行的内容):
bash -x run.sh

假设你的脚本名为 run.sh ;)

1
在bash中,$_是先前命令的最后一个参数。要终止后台作业,您必须使用作业号(或PID)。以下是使用作业号的示例:
[15:29:29 ~]$ gvim &
[2] 28509
[15:29:31 ~]$ kill %2
[15:29:39 ~]$
[2]+  Terminated              gvim
[15:29:42 ~]$

[2]是作业编号,在启动后台进程时显示。


我该如何捕获Firefox窗口的关闭? - sid_com

1

$_ 变量是您上一个后台作业的 PID。使用它来终止您的进程。要捕获错误/信号,请使用 trap(man bash 中有一个示例)。


我该如何捕捉Firefox窗口的关闭? - sid_com
1
@Fritschy: 是的!你说得对。给原帖发布者:如果屏幕上已经有一个Firefox窗口,情况就变得复杂了,你不能在所有情况下都做到这点。如果用户打开一个新选项卡,然后关闭原始选项卡,怎么办?即使您可以找出窗口何时关闭,也为时已晚了。假设您可以捕捉选项卡关闭(其实不行),那么如果用户关闭选项卡,然后执行“撤销关闭最后一个选项卡”操作呢?复制选项卡呢?简而言之,请重新考虑您的方法。 - n. m.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接