用 systemd 管理 aria2 下载服务

太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处
aria2下载日志

原笔记只留下了用户服务和日志命令,没有留下测试输出。这里把 aria2 放进当前用户的 systemd 服务管理器,适合个人下载机或只允许本机访问 RPC 的场景。命令按 aria2 1.37.0 文档中的选项整理;发行版仓库可能提供更旧的版本,先用 aria2c --version 检查,确认版本支持所需选项。

安装与目录

以 Debian、Ubuntu 为例:

sudo apt update
sudo apt install aria2
aria2c --version

其他发行版使用自己的包管理器安装 aria2。下面把下载目录、配置和 session 文件都放在当前用户可写的位置:

install -d -m 700 "$HOME/.config/aria2" "$HOME/.local/state/aria2"
install -d -m 755 "$HOME/aria2-downloads"
touch "$HOME/.local/state/aria2/session.txt"
chmod 600 "$HOME/.local/state/aria2/session.txt"

--save-session 要写入的文件必须由运行 aria2 的用户可写;先 touch 可以在首次启动前排除目录和权限错误。这里单独创建下载目录,不修改用户已有 Downloads 目录的权限。

配置 RPC 和 session

创建 ~/.config/aria2/aria2.conf

dir=TARGET_HOME/aria2-downloads
input-file=TARGET_HOME/.local/state/aria2/session.txt
save-session=TARGET_HOME/.local/state/aria2/session.txt
save-session-interval=60
enable-rpc=true
rpc-listen-all=false
rpc-listen-port=6800
rpc-secret=REPLACE_WITH_A_LONG_RANDOM_TOKEN

TARGET_HOME 和 token 换成实际值后锁住文件:

chmod 600 "$HOME/.config/aria2/aria2.conf"

TARGET_HOME 换成目标用户实际的 $HOME,不要假设它一定是 /home/用户名aria2 官方手册的 RPC 说明建议使用 --rpc-secret。客户端调用 RPC 方法时要把 token: 加在第一个参数前;rpc-listen-all=false 让 RPC 只监听本机。需要远程访问时,应先通过 SSH 隧道或其他受控网络路径暴露端口,并同时评估 TLS(rpc-secure)和防火墙规则。

save-session 保存的是错误或未完成的下载,不是所有已经完成的历史记录;save-session-interval=60 让运行中的任务定期写回。aria2 下次启动时会读取 input-file,因此重启后可通过 RPC 查询活动任务,确认未完成任务已恢复。

完整的用户级 service

先准备用户服务目录:

mkdir -p "$HOME/.config/systemd/user"

再创建 ~/.config/systemd/user/aria2cd.service

[Unit]
Description=aria2 download service

[Service]
Type=simple
ExecStart=/usr/bin/aria2c --conf-path=%h/.config/aria2/aria2.conf
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

/usr/bin/aria2c 不是所有发行版都相同;用 command -v aria2c 找到路径后再写入 ExecStart。原笔记中的服务名也是 aria2cd.service,排查时要保持 unit 名称一致。Restart=on-failure 只处理进程异常退出,不会等待网络可用,也不会证明 tracker 或 RPC 客户端已经连通。

systemctl --user daemon-reload
systemctl --user enable --now aria2cd.service
systemctl --user status aria2cd.service --no-pager

如果希望用户退出登录后仍运行,管理员或用户需要显式启用 linger:

loginctl enable-linger TARGET_USER

loginctl 官方手册源码说明,linger 会在开机时启动该用户的 manager,并在退出登录后保留它。没有 linger 时,用户 manager 的生命周期可能随登录会话结束,不能把“当前登录时能启动”当成“重启后无人登录也能运行”。启用 linger 需要相应权限;若机器策略不允许,应改用系统 service,并由管理员决定运行用户。

验证启动和 RPC

先确认 unit、进程和监听地址:

systemctl --user is-enabled aria2cd.service
systemctl --user is-active aria2cd.service
systemctl --user show aria2cd.service -p ExecStart -p MainPID
ss -ltnp

检查监听列表中的 6800 端口是否仅绑定回环地址。RPC 请求应携带 token,下面在 Bash 中运行,需要先安装 curljq。请求只查询版本,不会添加下载:

read -r -s ARIA2_SECRET
printf '\n'
printf '%s' "$ARIA2_SECRET" \
  | jq -Rs '{jsonrpc:"2.0",id:"version",method:"aria2.getVersion",params:[("token:" + .)]}' \
  | curl -sS http://127.0.0.1:6800/jsonrpc \
      -H 'content-type: application/json' \
      --data-binary @-
unset ARIA2_SECRET

运行到 read 时输入配置中的 secret 并回车,输入不会回显;不要在开启 set -x 的调试终端执行。Bash 的内建 printf 将 secret 通过管道交给 jq 编码,再从标准输入交给 curl。返回值应包含版本信息;只收到 JSON 错误仍不算验证成功。如果 unit 是 active 但端口不存在,检查 ExecStart、配置路径和 aria2 日志。

日志排查

查看本次启动以来的用户服务日志。journalctl 官方手册源码说明,-u 按 unit 过滤,-f 跟随新日志:

journalctl --user -u aria2cd.service -b --no-pager
journalctl --user -u aria2cd.service -n 100 -f
systemctl --user status aria2cd.service

-f 会持续跟随输出,结束时按 Ctrl-C。启动失败时先看完整错误,再检查:配置文件是否可读、dir 是否存在且可写、session 文件是否可写、端口是否已被占用,以及 ExecStart 路径是否真实存在。

tracker 历史线索

原记录中的 tracker 示例仍可作为排查旧任务或补充 tracker 列表时的线索。它们的可用性和可信度会变化,不能当作固定服务依赖:

udp://tracker.opentrackr.org:1337/announce
udp://tracker.torrent.eu.org:451
http://tracker.moeking.me:6969/announce
udp://tracker.moeking.me:6969/announce