Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本,可以在断开连接后生存,但不能在用户中断后生存_Bash_Gnu Screen_Nohup - Fatal编程技术网

Bash脚本,可以在断开连接后生存,但不能在用户中断后生存

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

我想编写一个bash脚本,如果用户断开连接,它将继续运行,但如果用户按下Ctrl+C,它可以中止

我可以这样解决它的第一部分:

#!/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的名字是从哪里来的了吗?