Linux后台执行命令&和nohup的具体使用方法
在Linux系统运维和日常使用中,我们常常需要将进程放到后台运行,避免终端关闭导致进程终止,或者占用当前终端无法执行其他操作。&和nohup是两个常用的实现后台执行的工具,本文将详细介绍它们的使用方法、区别以及实际应用场景。
一、&符号:临时后台运行
&是shell的内置操作符,作用是将命令放到后台执行,进程会脱离当前终端的前台交互,但是仍然依赖于当前终端的会话。如果终端退出(比如关闭终端窗口、断开SSH连接),后台进程会收到SIGHUP信号,默认会终止运行。
1. 基本使用方法
在命令末尾添加&即可将命令放到后台执行,语法格式如下:
command &
示例:后台运行一个循环打印日志的脚本
# 编写测试脚本test.sh,内容如下 #!/bin/bash while true do echo "$(date) 后台运行中" >> /tmp/test.log sleep 2 done # 后台执行脚本 bash test.sh &
执行后会返回进程的作业号和PID,例如:
[1] 12345
其中[1]是作业号,12345是进程PID。
2. 常用操作
查看后台作业:使用
jobs命令可以查看当前终端下的后台作业列表,例如:jobs # 输出示例: # [1]+ Running bash test.sh &
将后台作业调回前台:使用
fg %作业号命令,例如fg %1将作业1调回前台运行。暂停前台进程到后台:先按
Ctrl+Z暂停进程,再使用bg %作业号让进程在后台继续运行。
3. 局限性
使用&后台运行的进程,当终端退出时会收到SIGHUP信号终止,因此只适合临时后台运行、不需要长期存在的进程,不适合需要长时间运行的服务类进程。
二、nohup命令:忽略挂断信号的后台运行
nohup是"no hang up"的缩写,作用是让进程忽略SIGHUP信号,即使终端退出,进程也不会被终止。默认情况下,nohup会将进程的输出重定向到当前目录的nohup.out文件中,如果当前目录不可写,则会重定向到$HOME/nohup.out。
1. 基本使用方法
nohup和&通常结合使用,语法格式如下:
nohup command &
示例:使用nohup后台运行之前的test.sh脚本
nohup bash test.sh &
执行后会返回进程PID,同时提示输出被重定向到nohup.out:
[1] 12346 nohup: ignoring input and redirecting stderr to stdout
2. 自定义输出重定向
默认nohup.out会不断追加内容,如果不需要默认输出,可以自定义重定向输出位置,语法如下:
# 将标准输出和标准错误都重定向到指定文件,后台运行 nohup bash test.sh > /tmp/test_output.log 2>&1 &
其中2>&1表示将标准错误(文件描述符2)重定向到标准输出(文件描述符1),统一输出到指定日志文件。
3. 查看和管理进程
因为nohup启动的进程不依赖当前终端,所以无法用jobs命令查看,需要使用ps命令查看进程状态:
# 查看指定进程 ps -ef | grep test.sh # 输出示例: # root 12346 12300 0 10:00 pts/0 00:00:00 bash test.sh
如果需要终止进程,使用kill命令加上PID即可:
kill 12346 # 如果进程无法终止,可以使用强制终止信号 kill -9 12346
三、&和nohup的区别对比
| 对比项 | & | nohup |
|---|---|---|
| 依赖终端 | 是,终端退出进程终止 | 否,终端退出进程继续运行 |
| 信号处理 | 收到SIGHUP信号会终止 | 忽略SIGHUP信号 |
| 适用场景 | 临时后台运行、短期任务 | 长期运行的服务、需要脱离终端的任务 |
| 输出重定向 | 默认输出到当前终端,可手动重定向 | 默认重定向到nohup.out,可自定义重定向 |
四、实际应用场景示例
1. 临时后台执行打包任务
如果需要在后台临时执行一个大文件打包任务,不需要长期运行,可以使用&:
tar -czf /tmp/bigfile.tar.gz /path/to/bigfile &
2. 长期运行服务进程
如果需要运行一个长期提供服务的进程,比如自定义的守护脚本,需要使用nohup结合&:
nohup /path/to/service.sh > /var/log/service.log 2>&1 &
五、注意事项
使用nohup时,如果当前目录没有写权限,nohup.out会生成在用户家目录下,避免日志文件占用过多磁盘空间,建议自定义输出路径并定期清理日志。
如果需要一次性启动多个后台进程,建议记录每个进程的PID,方便后续管理。
部分shell可能对作业管理有特殊配置,如果&使用异常,可以检查shell的huponexit选项,使用
shopt | grep huponexit查看,若开启可关闭:shopt -u huponexit。