pueue升级到0.4.0迁移数据
文章目录
关于pueue
pueue是一个命令行任务管理工具,pueue并不是类似于ps
的管理系统所有任务的管理工具,而是用于安排执行长时间运行任务的工具,pueue可以管理这些任务的执行顺序,并跟踪这些长时间运行任务的状态和输出结果。
简而言之,pueue是一个shell
命令队列的管理工具,名字pueue即来源于queue
队列,最重要的是,有很多便利功能和抽象管理功能。
pueue以守护进程方式运行,因此并没有绑定到任何终端,因此可以在同一台计算机上的任何终端控制任务。即使关闭所有的ssh
会话,队列仍旧被连续处理。
pueue主要的功能包括:
- 计划要执行的命令时可以指定命令执行的工作目录
- 可以方便的查看命令的输出内容
- 可以和正在运行的进程交互
- 当需要释放计算机的处理能力时,可以随时暂停/恢复任务
- 可以方便的操作已安排的任务顺序
- 可以同时并行运行多个任务,还可以指定希望同时并行运行的任务数
- 所有功能支持
Linux
和MacOS
,Windows
上支持部分功能
pueue 0.4.0版本说明
pueue于2020年5月5日发布0.4.0
版本,包括:
新特性
- 添加
--after [ids]
选项。当任务设置该选项时,仅当指定的依赖任务全部成功执行后才会执行,反之,当依赖任务失败时,任务也将失败。 - 添加新状态
FailedToStart
。当无法开始任务时,任务为此状态。 - 添加新状态
DependencyFailed
。当任务的任何依赖任务失败时,任务为此状态。 - 添加新的配置选项
read_local_logs
。默认值为true
。默认情况下,假定守护进程和客户端运行在同一台设备。当客户端可以直接读取日志文件时,毋需通过套接字发送日志。可以按照实际情况设置为false
,例如将pueue和ssh
端口转发结合使用。
改进
- 进程输出日志不再永久保存在内存中,在日志输出大量内容时,将显著减少内容使用。
- 处理从磁盘读取日志输出时在内存中压缩,这将减少带宽和内存的使用量。
变化
- pueue不再将日志输出存储在其备份文件中。
pueue 0.4.0 数据迁移
虽然pueue 0.4.0版本说明中并没有直接阐述数据迁移问题,不过升级后需要迁移数据才能正常运行。需要迁移的状态文件在
~/.local/share/pueue/state.json
备份pueue状态文件
cp ~/.local/share/pueue/state.json ~/.local/share/pueue/state.bak.json
添加read_local_logs
设置
运行pueue。
pueued -vvv
如果看到如下报错
[ERROR] Failed to deserialize previous state log: Error("missing field `read_local_logs`", line: 1, column: 91)
说明状态文件缺少read_local_logs
,也就是新特性中新增的配置选项read_local_logs
。
数据迁移方式为
jq '.settings.client.read_local_logs = true' ~/.local/share/pueue/state.bak.json > ~/.local/share/pueue/state.json
添加dependencies
字段
运行pueue。
pueued -vvv
如果看到如下报错
[ERROR] Failed to deserialize previous state log: Error("missing field `dependencies`", line: 31, column: 5)
说明状态文件缺少任务之间的依赖关系dependencies
,也就是新特性中新增的--after [ids]
选项。
在前面脚本基础上增加数据迁移方式为
jq '.settings.client.read_local_logs = true' ~/.local/share/pueue/state.bak.json |
jq '.|(.tasks[].dependencies=[])' > ~/.local/share/pueue/state.json
其中第二行用于添加dependencies
设置。
更新Failed
值
运行pueue。
pueued -vvv
如果看到如下报错
[ERROR] Failed to deserialize previous state log: Error("unknown variant `Failed`, expected one of `Queued`, `Stashed`, `Running`, `Paused`, `Done`, `Locked`", line: 8004, column: 24)
这是因为升级后任务没有了Failed
状态,取而代之的是Done
状态,并增加result
字段,其中包含Failed
字段,值为错误代码。
在前面脚本基础上增加数据迁移方式为
jq '.settings.client.read_local_logs = true' ~/.local/share/pueue/state.bak.json |
jq '.|(.tasks[].dependencies=[])' |
jq '.tasks[]|=if .status == "Failed" then (.|(.result = {"Failed": .exit_code})|(.status = "Done")) else . end' > ~/.local/share/pueue/state.json
其中第三行用于更新Failed
的值。
更新Done
值
运行pueue。
pueued -vvv
如果看到如下报错
thread 'main' panicked at 'Got a 'Done' task without a task result. Please report this bug.', client/output.rs:108:25
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
这是因为升级后当任务状态为Done
时,需要包含result
字段,值为Success
。
在前面脚本基础上增加数据迁移方式为
jq '.settings.client.read_local_logs = true' ~/.local/share/pueue/state.bak.json |
jq '.|(.tasks[].dependencies=[])' |
jq '.tasks[]|=if .status == "Done" then (.|(.result = "Success")) else . end' |
jq '.tasks[]|=if .status == "Failed" then (.|(.result = {"Failed": .exit_code})|(.status = "Done")) else . end' > ~/.local/share/pueue/state.json
注意,更新脚本插入在第三行,因为更新Failed
值时把status
字段设置为了Done
.