因为systemd timer不加载用户shell环境,缺少path、home及php运行时上下文,导致composer命令报错;需用绝对路径调用php+composer phar、显式设置workingdirectory和composer_home,并添加--no-interaction等参数确保非交互执行。

为什么不能直接在 systemd Timer 中执行 composer 命令
因为 systemd 启动的进程默认没有加载用户 shell 环境(比如 $PATH、$HOME),也缺少 Composer 所需的 PHP 运行时上下文。直接写 composer audit 会报 command not found 或 PHP Fatal error: Class 'Composer\Autoload\ClassLoader' not found。
- systemd 不读取
~/.bashrc或/etc/profile,所以即使你本地能跑通,Timer 里大概率失败 -
composer可能是全局安装(/usr/local/bin/composer),也可能是 phar 形式放在项目目录,systemd 不知道该用哪个 - PHP CLI 配置可能和 web server 不同(比如禁用了某些扩展),
composer audit依赖openssl和json,缺一不可
如何让 systemd Timer 正确调用 composer audit
核心是显式声明运行环境:指定完整路径、PHP 解释器、工作目录,并绕过交互式限制。
- 用绝对路径调用 PHP + Composer phar:
/usr/bin/php /opt/composer.phar audit --no-interaction --format=json - 或使用系统级全局 composer(确认存在):
/usr/local/bin/composer audit --no-interaction --format=json - 必须设置
WorkingDirectory=为项目根目录(含composer.lock),否则报No composer.json or composer.lock found - 加上
Environment="COMPOSER_HOME=/var/lib/composer"避免权限问题(systemd 用户通常无权写入~/.composer)
composer audit 在 CI/CD 和定时任务中的关键差异
本地开发时 composer audit 默认走 GitHub Advisory Database,但定时任务中常因网络或认证失败静默退出——它不会主动报错,而是返回非零码却无输出。
yuanfang-skills 的共享设计系统,提供 token CSS 变量、12+ 主题以及可复用的布局类型 HTML 块,供 yuanfang-html-image(以及 fu...)使用。
- 务必加
--fail-on-warnings强制暴露中危及以上漏洞(否则默认只对高危 fail) - 加
--ignore=...只用于临时跳过已知误报,不要长期写死;更推荐用composer audit --format=json | jq -r '.advisories[] | select(.severity == "critical") | .title'做分级告警 - 注意 PHP 版本兼容性:
composer audit要求 PHP ≥ 8.0,若服务器仍跑 PHP 7.4,命令会直接崩溃,得先检查/usr/bin/php --version
一个可立即部署的 systemd Timer 示例
假设项目在 /srv/myapp,Composer phar 放在 /opt/composer.phar,目标是每天凌晨 3 点扫描并记录结果。
[Unit] Description=Run composer audit for /srv/myapp After=network.target [Service] Type=oneshot User=www-data WorkingDirectory=/srv/myapp Environment="COMPOSER_HOME=/var/lib/composer" ExecStart=/usr/bin/php /opt/composer.phar audit --no-interaction --fail-on-warnings --format=json StandardOutput=append:/var/log/composer-audit.log StandardError=append:/var/log/composer-audit.log TimeoutSec=300 [Install] WantedBy=multi-user.target
对应 Timer 文件需启用:sudo systemctl enable --now composer-audit.timer。别忘了手动创建 /var/lib/composer 并赋权:sudo chown www-data:www-data /var/lib/composer。
真正容易漏掉的是 PHP 扩展状态和日志轮转——composer audit 不输出进度,失败时只有 exit code 和空日志,得靠 journalctl -u composer-audit.service -n 50 查真实原因。










