Bash:最后(尝试,除外)异常

标签 bash execution finally

我想在 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/

相关文章:

bash - 检查当前 bash 的详细程度

linux - bash shell脚本问题中的日期格式错误帮助

operating-system - 当您覆盖内存映射可执行文件时会发生什么?

c# - 判断是否因为抛出异常而执行到 finally block 中

regex - sed 命令 : regex in bash to exclude certain strings

linux - 在 bash 脚本中将字符串发送到标准输入

swift - Swift + Combine 中是否有类似于 PromiseKit 的 "ensure"的功能?

javascript - 如何添加 polyfill 以支持 Edge 中的 finally()?

apache-spark - 区分 Apache Spark 中的驱动程序代码和工作代码

javascript - 在我的代码中出现一些异常