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

相关推荐
c++逐梦人2 小时前
Linux生产者消费者模型
linux
Yolo566Q2 小时前
从机理到实践告别“黑箱”模拟:OpenGeoSys(OGS6)多物理场THMC 全耦合建模与Python自动化分析
运维·自动化
网络安全许木2 小时前
自学渗透测试第16天(Linux文本处理进阶)
linux·运维·服务器·网络安全·渗透测试
Lugas Luo2 小时前
车载录像存储性能模拟测试工具设计
linux·嵌入式硬件·测试工具
铅笔小新z2 小时前
【Linux】进程控制(下)
linux·运维·chrome
企鹅的蚂蚁2 小时前
Ubuntu 22.04 终端进阶:Terminator 安装与快捷键完全手册
linux·运维·ubuntu
不会写程序的未来程序员3 小时前
nvm 安装教程:Node.js 版本管理全攻略 (Win/Mac/Linux) + .nvmrc 实战
linux·macos·node.js·前端开发·环境配置·nvm
黄焖鸡能干四碗3 小时前
网络安全风险评估报告(WORD版本)
大数据·运维·网络·人工智能·制造
跨境麦香鱼3 小时前
2026自动化抢鞋机器人:如何通过高并发代理提高成功率?
运维·网络·自动化