使用用户输入运行脚本,然后断开作业并在后台运行

使用用户输入运行脚本,然后断开作业并在后台运行

所以我有一个 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,highinput作为命令行参数,或者可能作为导出的环境变量,然后使用实际的 nohup命令。这应该更简单并且更灵活,因为您可以编写第二部分的脚本执行而不必处理交互式提示。

另一种可能性是使用终端多路复用器,例如tmuxscreen,以便在断开连接时可以重新连接到会话(或者您可以自己将其分离),也可以在脚本继续运行时打开一个新窗口来运行新的 shell初始窗口。无论您是否实施上述解决方案之一,采用tmuxscreen都是一个好主意,所以如果可以的话请尝试一下。

答案2

您可以将一长串命令括在大括号中,然后使用 & 继续,而无需等待。

echo "Read input"
{
    # all your commands in curly braces
    # ...
} & exit 0

然后您可以退出,而无需等待所有命令完成。即使您与服务器断开连接,它也应该继续运行。

相关内容