【Linux】耗时任务执行并邮件通知

在日常开发或运维中,经常会遇到下载大文件、拉取镜像、运行数据处理、编译任务或在远程服务器执行长时间任务但无法持续监控终端的情况。这类任务通常耗时较长,用户希望它们能在后台稳定运行,并在完成后自动反馈结果,而不依赖复杂的调度系统。因此目标是:任务后台执行 + 自动通知结果 + 尽量轻量化实现。

本文提供一种极简且工程实用的方案:

  • 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 或任务系统的前提下,实现完整的后台任务闭环。

相关推荐
Championship.23.2432 分钟前
Linux 3.0 锁机制与故障排查详解
linux·运维·服务器
天疆说1 小时前
Zotero Connector 在 Edge 里找不到桌面 Zotero(Linux / Zotero 9.0.6 / Edge 150)
linux·前端·edge
风123456789~2 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
IT曙光3 小时前
ubuntu apt-get离线源制作
linux·ubuntu
其实防守也摸鱼3 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚4 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
玖玥拾5 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
土星云SaturnCloud5 小时前
边缘计算驱动绿氢生产过程智能寻优:电解槽级实时优化技术解析
服务器·人工智能·ai·边缘计算
Darkwanderor5 小时前
对Linux的进程控制的研究
linux·运维·c++
Web极客码6 小时前
突破并发瓶颈:云端高性能架构如何赋能海外 AI Agent 矩阵的高效产出
服务器·人工智能·架构