nohup 在退出 Shell 提示后执行命令
大多数情况下,您通过 ssh 登录远程服务器。如果您启动 shell 脚本或命令并退出(中止远程连接),则进程/命令将被终止。有时作业或命令需要很长时间。如果您不确定作业何时完成,那么最好让作业在后台运行。但是,如果您退出系统,作业将被您的 shell 停止并终止。当进程收到 SIGHUP 时,您要做什么才能让作业在后台运行?
了解 nohup 命令
答案很简单,使用 nohup 命令行实用程序,它允许运行命令/进程或 shell 脚本,这些脚本可以在您从 shell 注销后继续在后台运行:
nohup 命令语法:
语法如下
nohup command-name &
或
nohup /path/to/command-name arg1 arg2 &
在哪里,
- command-name: 是 shell 脚本或命令的名称。您可以将参数传递给命令或 shell 脚本。
- &:nohup 不会自动将其运行的命令放在后台;您必须通过在命令行末尾加上 & 符号来明确执行此操作。
使用jobs -l 命令列出所有作业:
# jobs -l
nohup 命令示例
首先,使用 ssh 命令登录远程服务器:
$ ssh user@remote.server.com
或者
$ ssh vivek@server1.example.com
我将执行一个名为 pullftp.sh 的 shell 脚本:
# nohup pullftp.sh &
输入 exit 或按 CTRL + D 从远程服务器退出:
# exit
在这个例子中,我将查找所有设置了 setuid 位的程序和脚本,输入:
# nohup find / -xdev -type f -perm +u=s -print > out.txt &
键入 exit 或按 CTRL + D 退出远程服务器。
# exit
请注意,nohup 不会更改 COMMAND 的调度优先级;请使用 nice 命令来实现此目的。语法是:
# nohup nice -n -5 ls / > out.txt &
正如您所见,nohup 会在您退出 shell 后保持进程运行。阅读和的手册页以获取更多信息。请注意,nohup 几乎适用于 Solaris/BSD/Linux/UNIX 变体。
其他选择(读者建议)
您可以使用 at 命令将作业排队等待稍后执行。例如,您可以运行 pullftp.sh 脚本以将(一分钟)后执行的作业排队:
$ echo "pullftp.sh" | at now + 1 minute
您也可以使用 screen 命令来实现相同的目的。disown shell 内部命令用于相同的目的。您可以尝试以下方法:
$ pullftp.sh &
$ disown -h
$ exit
来自 bash 手册页:
默认情况下,从活动作业表中删除每个 JOBSPEC 参数。如果指定了 -h 选项,则不会从表中删除作业,但会对其进行标记,以便在 shell 收到 SIGHUP 时不会向该作业发送 SIGHUP。当未提供 JOBSPEC 时,-a 选项表示从作业表中删除所有作业;-r 选项表示仅删除正在运行的作业。
推荐阅读
- 请参阅我们的常见问题解答部分,了解有关 Linux/Unix 进程管理的disown 命令示例、jobs 命令示例、bg 命令示例和fg 命令示例。
- 手册页 –