在nohup中运行部分脚本shell

在nohup中运行部分脚本shell

如何在 nohup 模式下运行部分 shell 脚本?我的脚本如下:

#!/bin/bash

command_1
script2.sh
script3.sh
...
(tests & loops, etc)
script4.sh
script5.sh

我想要运行的部分来自脚本3.sh脚本5.sh在 nohup 模式下不使用命令“nohup”或“&”,因此如果用户断开连接,脚本将继续执行。

不知道我的问题是否足够清楚:)谢谢!

答案1

主要目的nohup是将程序与HUP信号隔离开来,通常在控制 TTY 断开连接时接收(例如,由于用户注销)。

你可以使用 shell 内置命令完成同样的事情trap

$ help trap
Trap signals and other events.

Defines and activates handlers to be run when the shell receives signals
or other conditions.

ARG is a command to be read and executed when the shell receives the
signal(s) SIGNAL_SPEC.  If ARG is absent (and a single SIGNAL_SPEC
is supplied) or `-', each specified signal is reset to its original
value.  If ARG is the null string each SIGNAL_SPEC is ignored by the
shell and by the commands it invokes.

因此,您可以使用该trap命令将脚本的某些部分与HUP信号隔离开来,方法是传递一个空字符串作为操作。例如:

#!/bin/sh

command_1
script2.sh

# Starting ignoring HUP signal
trap "" HUP

script3.sh
...
(tests & loops, etc)
script4.sh

# Resume normal HUP handling.
trap - HUP

script5.sh

您可能需要确保脚本的输出被定向到文件(否则断开连接后您将丢失所有输出,即使脚本继续运行)。

您可能还想考虑简单地在以下控制下运行脚本屏幕,因为这样做的好处是您可以在断开连接后重新连接到正在运行的脚本。

答案2

一般来说,当脚本仍在后台运行时退出脚本是不好的做法。

应用 KISS 原则,即“保持简单,Sam”(针对 Sam 的各种价值观)。您了解 nohup,只需使用它。

如果您希望script3.shscript5.sh脚本返回到 shell 提示符后,所有条件和循环都运行完成,请将脚本的该部分放在单独的文件中。

现在你得到了两个脚本。第一个脚本script0.sh

#!/bin/bash

command_1
script2.sh
nohup script35.sh &
exit

script35.sh:

#! /bin/bash
script3.sh
...
(tests & loops, etc)
script4.sh
script5.sh

如果你想从 cron 启动脚本,何必? 如果您从 shell 会话开始,请遵循@larsks 的建议,并使用终端仿真器/多路复用器(如screen或 )tmux

相关内容