所以我有一个 bash 脚本,它首先向用户请求一系列三个变量。然后,我希望脚本在与会话断开连接的后台运行,这样当我切断笔记本电脑和超级计算机之间的连接时,脚本仍然会运行。
要求变量使用 echo ,代码如下所示:
echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input
然后它继续执行一长串命令。
但是我不知道如何成功地从我的会话中断开此作业。上次“disown”命令不起作用,因为未创建在我注销后的步骤中生成的文件。
据我了解, nohup 在这里不起作用,因为这会阻止它读取脚本一开始要求我提供的任何输入。
那么有没有办法设置呢?
答案1
您可以通过模拟nohup
脚本第二部分中的操作来实现这一点。
该nohup
命令仅执行以下操作:
重定向标准文件描述符,以便脚本不会尝试读取或写入终端。
捕获 SIGHUP 信号并忽略它。 SIGHUP 是进程在其控制终端关闭时收到的信号。如果忽略它,进程将在终端关闭后继续运行。
您可以使用以下脚本来完成此操作:
echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input
(
trap '' 1 # Ignore SIGHUP
# Series of long running commands
# using $low, $high and $input
) </dev/null >myscript.log 2>&1 &
最后一行将 stdin 从 /dev/null 以及 stdout 和 stderr 重定向到 a myscript.log
(您可以选择更好的文件名,并可能使用时间戳或类似的文件名来使其唯一。)
最后,您将整个过程置于后台,并使用最终的&
.
另一种可能性是将脚本分成两部分,让第二部分采用low
,high
和input
作为命令行参数,或者可能作为导出的环境变量,然后使用实际的 nohup
命令。这应该更简单并且更灵活,因为您可以编写第二部分的脚本执行而不必处理交互式提示。
另一种可能性是使用终端多路复用器,例如tmux
或screen
,以便在断开连接时可以重新连接到会话(或者您可以自己将其分离),也可以在脚本继续运行时打开一个新窗口来运行新的 shell初始窗口。无论您是否实施上述解决方案之一,采用tmux
或screen
都是一个好主意,所以如果可以的话请尝试一下。
答案2
您可以将一长串命令括在大括号中,然后使用 & 继续,而无需等待。
echo "Read input"
{
# all your commands in curly braces
# ...
} & exit 0
然后您可以退出,而无需等待所有命令完成。即使您与服务器断开连接,它也应该继续运行。