在日常开发或运维中,经常会遇到下载大文件、拉取镜像、运行数据处理、编译任务或在远程服务器执行长时间任务但无法持续监控终端的情况。这类任务通常耗时较长,用户希望它们能在后台稳定运行,并在完成后自动反馈结果,而不依赖复杂的调度系统。因此目标是:任务后台执行 + 自动通知结果 + 尽量轻量化实现。
本文提供一种极简且工程实用的方案:
- TSP(task-spooler):轻量任务队列
- msmtp:最小依赖邮件发送工具
一、核心思路
将"任务执行"和"通知发送"合并为一个原子操作:
bash
tsp bash -c '任务 && 成功通知 || 失败通知'
这样可以保证:
- 任务在后台执行
- 通知只在任务结束后发送
- 能区分成功 / 失败
二、环境准备
1. 安装 TSP
bash
sudo apt update
sudo apt install task-spooler
设置最大并发(强烈建议):
bash
tsp -S 1
说明:
-S 1:串行执行任务(避免资源争抢)- 特别适合 GPU / IO 密集任务
常用命令:
bash
tsp -l # 查看任务队列
tsp -c <id> # 查看任务输出
tsp -r <id> # 重新执行任务
2. 安装 msmtp
bash
sudo apt install msmtp msmtp-mta
3. 配置邮箱
编辑配置文件:
bash
vi ~/.msmtprc
示例(以 QQ 邮箱为例):
ini
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account qq
host smtp.qq.com
port 587
from <你的邮箱>@qq.com
user <你的邮箱>@qq.com
password <授权码>
account default : qq
设置权限:
bash
chmod 600 ~/.msmtprc
4. 测试邮件发送
bash
printf "Subject: 测试\n\nhello from server\n" | msmtp your@email.com
使用包含 tsp 的测试,可以只包含标题
bash
tsp bash -c 'printf "Subject:任务结束" | msmtp your@email.com'
三、快速开始
部分示例默认 TSP 以单线程模式运行 (tsp -S 1)。
1. 提交一个后台任务
tsp sleep 60
执行该命令后,终端会立即返回,而任务将在后台排队执行。此时你可以继续使用当前 shell,不会被阻塞。
2. 查看任务队列
tsp -l # 查看当前任务列表(最常用)
示例输出如下:
ID State Output E-Level Times(r/u/s) Command
12 running /tmp/ts-out.12 - 0/0/0 sleep 60
说明:
ID:任务编号State:任务状态(running / finished 等)Output:任务输出日志路径Command:实际执行的命令
3. 查看任务输出
bash
tsp -c 12 # 查看 ID 为 12 的任务输出
该命令用于实时查看任务执行过程中的标准输出内容,适用于调试或观察长任务运行状态。
4. 任务完成后发送邮件通知
在 TSP 队列中,任务执行完成后可以继续提交一个"通知任务",实现解耦式通知机制:
bash
tsp bash -c '
printf "Subject: 任务完成\n\n任务已执行完毕" | msmtp your@email.com
'
该任务会在前序任务执行完成后自动进入队列执行,从而实现任务执行与通知发送的串行解耦
四、高级应用
1. 日志直发
在实际运维与训练任务中,最有价值的信息通常是完整标准输出与错误输出日志。该模式中,邮件内容即为任务运行的原始 log(stdout + stderr)。
bash
tsp bash -c '
your_command 2>&1 | msmtp your@email.com
'
更规范版本(带标题 + 完整日志)
bash
tsp bash -c '
{
echo "Subject: 任务结束"
echo
your_command 2>&1
} | msmtp your@email.com
'
在日志非常长的情况下(例如训练任务、编译任务),通常不需要完整输出,而只关心最后的关键信息,可以使用 tail 进行截取:
bash
tsp bash -c '
{
echo "Subject: 任务结束"
echo
your_command 2>&1 | tail -n 200
} | msmtp your@email.com
'
2. 原子模式
如果只需要"任务结束提示",不关心执行结果:
bash
tsp bash -c '
your_command \
; echo -e "Subject: 任务结束\n\n已完成" | msmtp your@email.com
'
成功 / 失败都通知(推荐):
bash
tsp bash -c '
your_command \
&& echo -e "Subject: 任务成功\n\n已结束" | msmtp your@email.com \
|| echo -e "Subject: 任务失败\n\n执行异常" | msmtp your@email.com
五、总结
本文围绕"轻量后台任务执行 + 邮件自动通知"这一核心需求,构建了一套极简但工程实用的 Linux 任务执行方案。
整体设计的关键在于两个工具的组合:
- TSP(task-spooler):负责任务队列化与后台调度
- msmtp:负责低成本、无依赖的邮件通知能力
通过二者结合,可以在不引入复杂 CI/CD 或任务系统的前提下,实现完整的后台任务闭环。