在bash脚本中,我通过ssh在远程机器上执行命令。如果用户通过按下Ctrl + C来终止脚本,它只会停止脚本 - 甚至不会停止ssh客户端。此外,即使我杀死ssh客户端,远程命令仍在运行...
如何让bash在按下Ctrl + c时杀死本地ssh客户端和远程命令调用?
一个简单的脚本:
#/bin/bash
ssh -n -x root@db-host 'mysqldump db' -r file.sql
最终我找到了这样的解决方案:
#/bin/bash
ssh -t -x root@db-host 'mysqldump db' -r file.sql
shopt -s huponexit; your_command
。这可能不起作用,因为man页面说huponexit仅适用于交互式shell。ssh -t
应该可以工作,因为当连接关闭时,从终端读取的内容将得到EOF或错误,这会使大多数程序退出。trap "some_command" SIGINT
当您按下Ctrl+C时,将在本地执行some_command
。 help trap
将告诉您有关其其他选项的信息。
关于ssh
问题,我对ssh不是很了解。也许您可以使其调用ssh -n -x root@db-host 'killall mysqldump'
而不是some_command
来终止远程命令?
#!/bin/bash
Answer=(Alive Dead)
Index=0
while [ ${Index} -eq 0 ]; do
if ! kill -0 ${PPID} 2> /dev/null ; then Index=1; fi
echo "Parent PID ${PPID} is ${Answer[$Index]} at $(date +%Y%m%d%H%M%S%Z)" > ~/NowTime.txt
sleep 1
done
我使用"ssh remote_server ./test_script.sh"来调用它。 在远程服务器上,"watch cat ~/NowTime.txt"显示文件中的时间戳增加,并声明父进程仍在运行; 一旦我在启动进程中按下CTRL/C,远程服务器上的脚本会注意到其父进程已经死亡,然后退出。