TOC
CHAT

nohup后台运行任务命令使用教程

日常运维经常需要运行一些耗时任务,例如编译程序、执行脚本或启动服务。然而,直接在终端中运行这些任务可能会遇到一个问题:一旦终端关闭或断开连接,任务就会被终止。幸运的是,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 注意事项

  • 避免误杀重要进程:在使用killpkill命令时,务必确认目标进程,避免误杀重要服务(如dockerd)。
  • 输出文件的清理:如果任务已经完成,记得清理输出文件(如nohup.out或自定义的输出文件),以避免占用不必要的磁盘空间。
  • 使用screentmux:对于复杂的后台任务管理,可以考虑使用screentmux。这些工具提供了更强大的功能,例如多窗口支持和会话恢复。

发表评论