环境变量与工作目录——脚本定时任务不跑的隐形元凶
为什么会不一样
不同运行环境的环境变量和工作目录不同:
| 场景 | 工作目录 | PATH |
|---|---|---|
| 手动在终端执行 | 你当前 cd 到的目录 | 完整 PATH(包含 ~/.bashrc 里的追加) |
| start_command.sh 启动脚本 | ~ | 默认 PATH(可能没读 .bashrc) |
| 定时任务 | 可能是 ~ 或其他 | 最小化 PATH,不包含你 .bashrc 里加的路径 |
| 发行版(proot) | proot 指定的目录 | 发行版自己的 PATH |
| 从开机自启 app 触发 | / | 几乎空 PATH |
统一解法:用绝对路径
最通用的解法——命令和文件路径都写完整路径,不依赖 PATH 和工作目录。
# 命令用完整路径
/data/data/com.termux/files/usr/bin/python /data/data/com.termux/files/home/task.py
# 文件也用完整路径
cat /data/data/com.termux/files/home/logs/task.log
脚本开头补 PATH
如果你觉得每条命令都写完整路径太啰嗦,在脚本开头补 PATH:
#!/data/data/com.termux/files/usr/bin/bash
export PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/local/bin:$PATH
# 后面就可以写短路径命令了
python task.py
git pull
定时任务的特殊处理
ZeroTermux 的定时任务(~/.timerdir/ 下的脚本)运行在一个极简环境里:
- 没有交互式 shell
- PATH 可能不完整
- 没有 TTY
建议在每个定时任务脚本开头:
#!/data/data/com.termux/files/usr/bin/bash
# 1. 设置 PATH
export PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/local/bin:$PATH
# 2. cd 到预期目录
cd /data/data/com.termux/files/home/my-project || exit 1
# 3. 执行你的任务
python backup.py >> /data/data/com.termux/files/home/logs/backup.log 2>&1
用 2>&1 把 stderr 也重定向到日志文件,出问题能看到完整错误信息。
发行版里的 PATH
proot 发行版一般会设置好自己的 PATH(比如 Debian 发行版的 PATH 是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin),和 ZeroTermux 原生 PATH 不同。如果你在发行版里还想调用 ZeroTermux 的命令,需要在发行版里显式挂载 Termux 的 PREFIX 路径。
自检方法
脚本写好后不要直接塞进定时任务或启动脚本,先手动跑:
# 在普通终端里测试
bash -x 你的脚本.sh
bash -x 会把执行的每条命令打印出来,方便排查哪里出问题。