好的,在 Linux 中让脚本在后台运行有多种方法,从简单到复杂,我将为您详细解释。
核心方法:使用 & 符号
最简单的方法是在命令的末尾加上一个 & 符号。
语法:
./your_script.sh &
作用:
- 它将命令放入后台执行,并立即返回一个
作业号 (job number)和进程ID (PID)。 - 你的终端(Shell)可以继续接受其他命令,而脚本在后台运行。
示例:
# 假设有一个名为 long_running_task.sh 的脚本
$ ./long_running_task.sh &
[1] 12345 # [1] 是作业号 (job number),12345 是进程ID (PID)
$
# 此时提示符已经返回,你可以继续输入其他命令
注意事项:
- 关闭终端会终止脚本:如果你关闭了启动脚本的那个终端窗口或 SSH 连接,这个后台任务通常会被终止(会收到 SIGHUP 信号)。
- 输出干扰:后台脚本的输出(stdout 和 stderr)仍然会显示在你的当前终端上,可能会干扰你的工作。
进阶方法:使用 nohup 命令
nohup (no hang up) 命令专门用于忽略 SIGHUP 信号,让你在退出终端或关闭 SSH 连接后,脚本依然能继续运行。
语法:
nohup ./your_script.sh &
nohup:确保进程不会因为终端退出而停止。&:将进程放入后台。
示例:
$ nohup ./long_running_task.sh &
[1] 12346
$ exit # 你可以安全地退出这个终端会话,脚本会继续在后台运行
输出重定向:
默认情况下,nohup 会将脚本的所有输出重定向到当前目录下的 nohup.out 文件中。你可以自定义输出文件:
# 将标准输出 (stdout) 和标准错误 (stderr) 都重定向到 my_log.log 文件
nohup ./your_script.sh > my_log.log 2>&1 &
# 解释:
# > my_log.log:将标准输出重定向到 my_log.log 文件
# 2>&1:将标准错误 (2) 也重定向到标准输出 (&1) 所在的地方(即同一个文件)
# &:放在后台运行
更现代的方法:使用 screen 或 tmux
这些是终端复用器,它们可以创建一个独立的会话,即使你断开连接,这个会话也会在服务器上继续保持。当你重新连接时,可以再次接入这个会话来查看进度。
以 tmux 为例:
-
启动一个新的 tmux 会话:
tmux new -s my_background_session -
在新的 tmux 窗口中正常运行你的脚本:
./your_script.sh -
分离 (detach) 当前会话(让它在后台运行):
按下快捷键Ctrl + b,然后松开,再按d。 -
现在你可以安全地断开 SSH 连接。当你重新登录后,想重新查看这个会话:
tmux attach -t my_background_session
screen 的用法类似,但 tmux 更现代,功能更强大。
专业方法:配置为系统服务 (Systemd Service)
对于需要长期运行、需要开机自启、或者需要精细管理(启动、停止、重启、查看状态)的生产环境脚本,最好的方法是将其配置为系统服务。
步骤:
- 创建一个服务单元文件 (例如:
/etc/systemd/system/my_service.service) - 编辑该文件:
[Unit] Description=My Custom Script Service # 服务描述 [Service] Type=simple # 服务类型 ExecStart=/path/to/your_script.sh # 脚本的绝对路径 Restart=on-failure # 失败时自动重启 User=myuser # 以哪个用户身份运行(可选) WorkingDirectory=/path/to/workdir # 工作目录(可选) [Install] WantedBy=multi-user.target # 在哪个系统运行级别启动 - 重新加载 systemd 配置:
sudo systemctl daemon-reload - 启动服务并设置开机自启:
sudo systemctl start my_service sudo systemctl enable my_service - 查看服务状态和日志:
sudo systemctl status my_service journalctl -u my_service -f # 实时查看日志
方法总结与选择
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
& | 临时性的短任务,需要终端同时做别的事 | 简单快捷 | 终端关闭则任务终止;输出会干扰终端 |
nohup ... & | 需要退出终端但让脚本继续运行的长任务 | 简单,不受终端断开影响 | 需要管理输出日志文件 |
screen/tmux | 交互式的长任务,需要后期再接管查看 | 功能强大,可以随时交互 | 需要学习简单的快捷键操作 |
| Systemd Service | 生产环境的守护进程、需要系统级管理的服务 | 功能最全,可管理性最强 | 配置相对复杂 |
简单建议:
- 临时测试一下脚本,用
&。 - 运行一个耗时任务并且要退出终端,用
nohup command &。 - 如果你想随时回去看看脚本的运行状态和输出,用
tmux。 - 如果你的脚本是一个重要的、需要一直运行的服务,用 Systemd。

被折叠的 条评论
为什么被折叠?



