Bash脚本预先关闭命令

时间:2018-04-19 07:24:10

标签: bash ubuntu-16.04

我有一个脚本,它通过ssh管理远程PC上的一些设置,以便此服务器转发ip流量。目前我有一个连接和断开连接脚本,我想将它们捆绑成一个易于处理的脚本。现在,此捆绑包启动连接并等待用户输入以启动断开连接脚本。

问题在于,我经常忘记关闭脚本,重启PC或其他,因此远程PC ip转发不会重置。所以我的问题是,有没有办法实现断开连接脚本的调用,以便在脚本完成或崩溃时自动调用它(进程被杀死,bash控制台被强制关闭,......)?

非常感谢,马丁

1 个答案:

答案 0 :(得分:2)

trap(有关详细信息,请参阅man bash)应该是您正在寻找的内容。一个小例子:

#!/bin/bash 
function cleanup() {
    echo "We're done."
    exit 0
}
trap cleanup SIGHUP SIGTERM

while true; do
    sleep 1
done

我自己不是ubuntu(systemd)专家,但我认为任何init都会首先尝试杀死剩余的进程(我的rc.K将使用SIGHUP,然后SIGTERM,然后再使用{{1} (后者我们不能拦截))。您可能需要进行一些实验(有关信号的更多信息,请查看SIGKILL

您还可以处理常规存在的man -s7 signal0(又名SIGINT)。

编辑:在评论中详细说明后续问题。

因为在上面的例子中我会从陷阱处理程序返回到无限循环,所以我必须包含一个显式的[Ctrl+c]调用。但是,如果您还使用它捕获并处理exit(或EXIT,相同的含义),则会在捕获任何(不仅仅是0)信号时看到陷阱处理程序输入两次(例如exit)。一次为信号,第二次为SIGHUP

如果您想在处理程序完成后确保脚本结束,您仍然可以调用EXIT,但在重置与之关联的陷阱后:

exit 0

这可能是想要你的用例调用。另一种选择是,如果你不一定需要脚本结束而你可以让它继续朝着它的自然结束#34;你也可以跳过#!/bin/bash function cleanup() { echo "We're done." trap - EXIT exit 0 } trap cleanup EXIT SIGHUP SIGTERM SIGINT while true; do sleep 1 done 处理程序。