Bash脚本,可以在断开连接后生存,但不能在用户中断后生存
我想编写一个bash脚本,如果用户断开连接,它将继续运行,但如果用户按下Ctrl+C,它可以中止 我可以这样解决它的第一部分:Bash脚本,可以在断开连接后生存,但不能在用户中断后生存,bash,gnu-screen,nohup,Bash,Gnu Screen,Nohup,我想编写一个bash脚本,如果用户断开连接,它将继续运行,但如果用户按下Ctrl+C,它可以中止 我可以这样解决它的第一部分: #!/bin/bash cmd=' #commands here, avoiding single quotes... ' nohup bash -c "$cmd" & tail -f nohup.out 但按Ctrl+C显然只会扼杀尾部过程,而不是主体。我能两个都要吗?可能使用屏幕?这可能是使用屏幕的最简单形式: screen -S SOMENAME scr
#!/bin/bash
cmd='
#commands here, avoiding single quotes...
'
nohup bash -c "$cmd" &
tail -f nohup.out
但按Ctrl+C显然只会扼杀
尾部
过程,而不是主体。我能两个都要吗?可能使用屏幕?这可能是使用屏幕的最简单形式:
screen -S SOMENAME script.sh
然后,如果断开连接,重新连接时只需运行:
screen -r SOMENAME
Ctrl+C
应按预期继续工作这可能是使用屏幕的最简单形式:
screen -S SOMENAME script.sh
然后,如果断开连接,重新连接时只需运行:
screen -r SOMENAME
Ctrl+C
应按预期继续工作这可能是使用屏幕的最简单形式:
screen -S SOMENAME script.sh
然后,如果断开连接,重新连接时只需运行:
screen -r SOMENAME
Ctrl+C
应按预期继续工作这可能是使用屏幕的最简单形式:
screen -S SOMENAME script.sh
然后,如果断开连接,重新连接时只需运行:
screen -r SOMENAME
Ctrl+C
应继续按预期工作事实1:当终端(例如xterm)关闭时,外壳程序应向其中运行的任何进程发送信号(“挂起”)。这让人想起了模拟调制解调器的时代,当你在线时,如果妈妈碰巧拿起了电话,程序需要自行清理。信号可能会被捕获,这样一个特殊的功能就可以进行清理(关闭文件、删除临时垃圾等)。“失去连接”的概念仍然存在,即使我们使用套接字和SSH隧道而不是模拟调制解调器。(概念不会改变;所有的改变都是我们用来实现它们的技术。)
事实2:Ctrl-C的效果取决于您的终端设置。通常,它会发送一个SIGINT,但您可以通过在shell中运行stty-a
并查找“intr”进行检查
使用bash的trap
命令,您可以充分利用这些事实。例如,尝试在窗口中运行此命令,然后按Ctrl-C并检查/tmp/trapped
的内容。然后再次运行,关闭窗口,再次检查/tmp/trapped
的内容:
#!/bin/bash
trap "echo 'one' > /tmp/trapped" 1
trap "echo 'two' > /tmp/trapped" 2
echo "Waiting..."
sleep 300000
有关信号的信息,您应该能够man信号
(FreeBSD或OSX)或man 7信号
(Linux)
(额外积分:看看我是如何给我的事实编号的?你知道为什么吗?)
所以。。。回答你的问题。要“生存”断开连接,您需要指定脚本启动时将运行的行为
(额外问题#2:现在你知道nohup的名字是从哪里来的了吗?事实1:当终端(例如xterm)关闭时,shell应该向其中运行的任何进程发送SIGHUP(“挂起”)。这让人想起了模拟调制解调器的时代,当你在线时,如果妈妈碰巧拿起了电话,程序需要自行清理。信号可能会被捕获,这样一个特殊的功能就可以进行清理(关闭文件、删除临时垃圾等)。“失去连接”的概念仍然存在,即使我们使用套接字和SSH隧道而不是模拟调制解调器。(概念不会改变;所有的改变都是我们用来实现它们的技术。) 事实2:Ctrl-C的效果取决于您的终端设置。通常,它会发送一个SIGINT,但您可以通过在shell中运行
stty-a
并查找“intr”进行检查
使用bash的trap
命令,您可以充分利用这些事实。例如,尝试在窗口中运行此命令,然后按Ctrl-C并检查/tmp/trapped
的内容。然后再次运行,关闭窗口,再次检查/tmp/trapped
的内容:
#!/bin/bash
trap "echo 'one' > /tmp/trapped" 1
trap "echo 'two' > /tmp/trapped" 2
echo "Waiting..."
sleep 300000
有关信号的信息,您应该能够man信号
(FreeBSD或OSX)或man 7信号
(Linux)
(额外积分:看看我是如何给我的事实编号的?你知道为什么吗?)
所以。。。回答你的问题。要“生存”断开连接,您需要指定脚本启动时将运行的行为
(额外问题#2:现在你知道nohup的名字是从哪里来的了吗?事实1:当终端(例如xterm)关闭时,shell应该向其中运行的任何进程发送SIGHUP(“挂起”)。这让人想起了模拟调制解调器的时代,当你在线时,如果妈妈碰巧拿起了电话,程序需要自行清理。信号可能会被捕获,这样一个特殊的功能就可以进行清理(关闭文件、删除临时垃圾等)。“失去连接”的概念仍然存在,即使我们使用套接字和SSH隧道而不是模拟调制解调器。(概念不会改变;所有的改变都是我们用来实现它们的技术。) 事实2:Ctrl-C的效果取决于您的终端设置。通常,它会发送一个SIGINT,但您可以通过在shell中运行
stty-a
并查找“intr”进行检查
使用bash的trap
命令,您可以充分利用这些事实。例如,尝试在窗口中运行此命令,然后按Ctrl-C并检查/tmp/trapped
的内容。然后再次运行,关闭窗口,再次检查/tmp/trapped
的内容:
#!/bin/bash
trap "echo 'one' > /tmp/trapped" 1
trap "echo 'two' > /tmp/trapped" 2
echo "Waiting..."
sleep 300000
有关信号的信息,您应该能够man信号
(FreeBSD或OSX)或man 7信号
(Linux)
(额外积分:看看我是如何给我的事实编号的?你知道为什么吗?)
所以。。。回答你的问题。要“生存”断开连接,您需要指定脚本启动时将运行的行为
(额外问题2:现在你知道nohup的名字是从哪里来的了吗?