后台任务怎么做
把长任务放到后台并扛住终端断开,最朴素的组合是 nohup 加重定向再加后台符号,或者用 setsid 脱离会话;jobs、fg、bg 管理当前 shell 里的作业。它们只解决不被挂断的问题,不提供崩溃重启与日志管理能力。正式任务应当注册成 systemd 服务或用 systemd-run 托管,适用于所有 Linux 发行版。
基本信息
| 后台执行 | 命令 & |
|---|---|
| 抗挂断 | nohup 命令 > 日志 2>&1 & |
| 脱离会话 | setsid 命令 > 日志 2>&1 & |
| 作业管理 | jobs -l、fg %1、bg %1、disown |
| 正式托管 | systemd 服务或 systemd-run |
典型使用场景
- 数据迁移、批量导入等跑数小时的任务,不能占着终端
- 临时压测或巡检脚本后台跑,同时继续做别的排查
- 远程会话不稳定,需要任务在断线后继续执行
- 把前台阻塞的命令挪到后台,腾出终端做别的事
- 用 systemd-run 起一个受 systemd 管理的临时任务
示例
示例
nohup /opt/scripts/import.sh > /var/log/import.log 2>&1 & # 后台跑并落日志
echo $! > /run/import.pid # 记下 PID 便于管理
jobs -l # 列出当前 shell 作业
fg %1 # 拉回前台观察
bg %1 # 再放回后台
disown -h %1 # 忽略挂断信号
tail -f /var/log/import.log # 跟踪进度
ps -p $(cat /run/import.pid) -o pid,etime,cmd # 确认仍在运行手段对比
| 手段 | 抗终端断开 | 崩溃重启 | 适用场景 |
|---|---|---|---|
| 命令 & | 否 | 否 | 几秒到几分钟的小任务 |
| nohup 加后台 | 是 | 否 | 临时长任务 |
| setsid 加后台 | 是 | 否 | 需要完全脱离会话 |
| systemd 服务 | 是 | 可配置 | 正式业务与守护进程 |
| systemd-run | 是 | 可选 | 临时任务且要统一日志 |
nohup 只挡挂断信号,不具备守护与拉起能力;关键任务要用 systemd 服务托管,崩溃可自动拉起,日志进 journal 可查。
相关信号对照
| 信号 | 编号 | 含义 |
|---|---|---|
| SIGHUP | 1 | 终端断开时发送,nohup 会忽略它 |
| SIGTERM | 15 | 默认的优雅终止信号 |
| SIGKILL | 9 | 强制终止,进程无法捕获 |
| SIGSTOP | 19 | 暂停进程,需要继续信号恢复 |
想临时托管一个任务又不想写单元文件,可以用 systemd-run --unit=batch-job /opt/scripts/job.sh,日志直接进 journal,用 journalctl -u batch-job 查看。