我想在 bash 脚本的末尾执行一些命令,即使用户按 CTRL+C 取消其执行也是如此。
我知道我可以从另一种编程语言(例如 Python)中运行 bash 脚本,这样我就可以使用“finally”(try-finally) block 来执行一些代码。
但是知道 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”,比如
陷阱“...;导出 1”
它可以在第一次 CTRL+C 时退出,但没有终止我想要的进程。
想法?
最佳答案
用这段代码得到了我想要的:
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
更好的资源。
关于Bash:最后(尝试,除外)异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3992243/