日常运维经常需要运行一些耗时任务,例如编译程序、执行脚本或启动服务。然而,直接在终端中运行这些任务可能会遇到一个问题:一旦终端关闭或断开连接,任务就会被终止。幸运的是,Linux提供了nohup
和&
这两个强大的工具,可以让任务在后台安全运行,即使终端关闭也不会中断。
1 nohup和&简介
nohup
是一个命令行工具,用于忽略挂起信号(SIGHUP),从而确保任务即使在终端关闭后也能继续运行。nohup的名字来源于 "no hang up",即“不挂起”。
&
是一个特殊的Shell符号,用于将命令放到后台执行。当在命令末尾加上&
时,任务会在后台启动,而终端会立即返回,允许你继续执行其他命令。
nohup
和&
可以结合使用,让任务在后台安全运行,并且即使终端关闭也不会中断。这是在Linux系统中管理后台任务的常用方法。
2 使用示例
假设需要在后台运行一个Docker构建任务,命令如下:
docker build -t kina-next:1.0 .
则可组合使用nohup
和&
,使得任务在后台运行,并且即使终端关闭,任务也不会中断:
nohup docker build -t kina-next:1.0 . &
随后nohup
命令会输出后台任务对应的进程ID(例如[1] 8841
),并用以下提示信息阻塞下一条输入(按回车即解除):
$ nohup: ignoring input and appending output to 'nohup.out'
当运行nohup
命令时,其会自动处理输入和输出,以确保任务可以在后台独立运行,即使终端关闭也不会中断。该提示信息是为了告知用户:
- 输入被忽略(任务不会等待用户输入)
- 输出被重定向到文件
nohup.out
(任务的输出不会丢失)
3 输出重定向
默认情况下,nohup
会将任务的输出追加到当前目录下的nohup.out
文件中。可以通过以下方式指定输出文件:
nohup docker build -t kina-next:1.0 . > build.log 2>&1 &
其中,>
将标准输出重定向到build.log
文件,2>&1
将标准错误也重定向到标准输出(即build.log
文件)。
4 查看后台任务的状态
4.1 使用jobs命令
如果执行nohup
后仍停留在同一终端会话(即任务仍在当前终端会话),可以使用jobs
命令查看任务状态:
jobs
输出示例:
[1]+ Running nohup docker build -t kina-next:1.0 . &
jobs
命令只能显示当前终端会话中的后台任务。如果终端会话已经结束(例如关闭了终端窗口或退出了SSH会话),那么jobs
命令就无法再显示之前启动的后台任务。
4.2 使用ps命令
如果任务已经不在当前终端会话中,可以使用ps
命令查找后台任务:
ps aux | grep docker
输出示例:
root 8841 0.0 0.2 1252956 5648 ? Sl 00:25 0:00 docker build -t kina-next:1.0 .
4.3 查看输出文件
nohup
的输出会被保存到文件中(默认为nohup.out
),可以通过以下命令查看实时内容:
tail -f nohup.out
或查看完整的输出内容:
cat nohup.out
5 终止后台任务
如果需要终止后台任务,可以使用kill
命令:
kill <PID>
如果任务没有响应,可以使用强制终止信号:
kill -9 <PID>
其中<PID>
是任务的进程ID,可通过ps
命令获取。
5 注意事项
- 避免误杀重要进程:在使用
kill
或pkill
命令时,务必确认目标进程,避免误杀重要服务(如dockerd
)。 - 输出文件的清理:如果任务已经完成,记得清理输出文件(如
nohup.out
或自定义的输出文件),以避免占用不必要的磁盘空间。 - 使用
screen
或tmux
:对于复杂的后台任务管理,可以考虑使用screen
或tmux
。这些工具提供了更强大的功能,例如多窗口支持和会话恢复。