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

相关推荐
raindayinrain4 分钟前
深入理解Linux内核--系统调用,性能优化
linux·性能优化·系统调用·返回值·入参·内核态用户态地址访问
小周学学学8 分钟前
GLPI 项目解读:开源 IT 资产管理与 ITSM 服务台平台
运维·开源·自动化·资产管理
码上有光10 分钟前
Linux:进程控制和进程替换
java·linux·服务器·进程控制·进程替换
weixin1997010801614 分钟前
《alibaba.idle.isv.order.ship 接入实录:闲鱼订单发货回传的5个隐式约束》(附Python源码)
服务器·前端·python
爱和冰阔落19 分钟前
【Linux】多线程打印为什么会乱?pthread 创建、等待、退出、取消与分离全实战
linux·运维·c++·redis
DYWorker00119 分钟前
基于RK3568的Linux驱动开发:实战——WDT
linux·驱动开发
小马同学-20 分钟前
四、虚拟化技术
运维·云计算
初願致夕霞21 分钟前
五种IO模型(详解非阻塞IO与多路转接)
linux·前端·网络·数据库·tcp/ip
Lzg_na23 分钟前
WiFi吞吐量和实际文件传输时速率差异原因以及定位
运维·网络
深圳多奥智能一卡(码、脸)通系统23 分钟前
智能梯控SDK可直接用于第三方开发对接的接口文档说明书
服务器·前端·算法