3

我想在 bash 脚本的末尾执行一些命令,即使用户按下 CTRL+C 来取消它的执行。

我知道我可以从另一种编程语言(例如 Python)中运行 bash 脚本,这样我就可以使用“finally”(try-finally)块来执行一些代码。

但是知道 StackOverflow 是一个交流绝妙想法的中心,我想问是否有办法从我的 bash 脚本中做我想做的事情。

那么,想法?

编辑:

我想要的是杀死在我的 bash 中打开的每个进程,即 selenium 和 Xvfb 进程。

我尝试将其写入代码:

 trap "selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" EXIT

但这迫使我在脚本内部每次运行子进程时多次按“CTRL + C”,例如:

Testing nsi.bd.helpcenter ...^C:  --  Total time: 0min 0seg
Testing nsi.bibliography ...^C:  --  Total time: 0min 0seg
Testing nsi.digitallibrary ...^C:  --  Total time: 0min 0seg
Testing nsi.digitallibraryinstaller ...^C:  --  Total time: 0min 1seg
Testing nsi.digitallibraryskins ...^C:  --  Total time: 0min 0seg
....#continues

将陷阱行的结尾从 EXIT 更改为 SIGINT ,如下所示:

trap "selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}');for pid in $selenium_pids; do kill -9 $pid;done; xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}'); for pid in $xvfb_pids; do kill -9 $pid; done" SIGINT

做同样的事情。

现在在第一个 CTRL+C 上退出什么?

因为我试图在字符串的最后添加一个“exit 1”,比如 trap "... ;exit 1"

它可以在第一个 CTRL+C 上退出,但没有杀死我想要的进程。

想法?

4

2 回答 2

8

用这段代码得到了我想要的:

finalize_xvfb_and_selenium() {
    selenium_pids=$(ps ux | awk '/selenium/ && !/awk/ {print $2}')
    for pid in $selenium_pids; do 
        kill -9 $pid
    done 
    xvfb_pids=$(ps ux | awk '/Xvfb/ && !/awk/ {print $2}') 
    for pid in $xvfb_pids; do 
        kill -9 $pid
    done
}

finalize_xvfb_and_selenium_and_exit() {
    finalize_xvfb_and_selenium
    echo -e "\n\nXvfb and seleniumrc finalized. Exiting ..."
    exit 13
}

#trap (CTRL+C) signal, to finalize proccess running before exit
trap finalize_xvfb_and_selenium_and_exit SIGINT

我知道有比kill -9到处使用更好的资源。

于 2010-10-22T04:27:36.703 回答
6

你想捕获信号。

当用户在终端点击 control-c 时,操作系统会向当前进程发出 SIGINT。这个信号可以被捕获和处理。你如何做到这一点是一个依赖于 shell 的问题,你应该检查你的 shell 手册页。

请注意,有些信号不能被捕获。kill -9尤其是发送的 SIGKILL 。


根据编辑:bash 可以返回您启动的程序的进程 ID。可以随时捕获所有它们,这样您就不必解析ps. 您也可以考虑向您的孩子发送一些其他信号(可能是 SIGUSR1),这些信号已经设置了一个陷阱,以便他们递归地杀死他们的孩子。

综上所述,你进入了深壳魔法领域。有一些书可能会有所帮助,但我不知道头顶上的标题。

于 2010-10-21T21:48:39.723 回答