You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用systemd运行PHP脚本时无法写入日志文件的问题

解决systemd运行PHP脚本无法写入日志的问题

遇到这种手动运行正常、通过systemd服务跑就无法写入日志的情况,我之前也踩过类似的坑,大概率是路径、权限或者运行环境的差异导致的,给你几个具体的排查和解决方向:

  • 相对路径导致日志写入到了意外位置
    手动运行脚本时,你的工作目录是脚本所在的文件夹,所以./log_...会写到脚本目录下;但systemd运行服务时,默认的工作目录通常是/或者服务用户的家目录(比如/root),而非脚本所在目录。

    解决办法是在脚本中使用绝对路径来指定日志文件:

    // 获取脚本所在的绝对目录
    $scriptDir = dirname(__FILE__);
    // 拼接日志文件的绝对路径
    $logFile = $scriptDir . '/log_' . date("j.n.Y") . '.txt';
    $log = "Api: " . $de->detail . " | " . date("h:i:sa") . " UTC" . PHP_EOL;
    file_put_contents($logFile, $log, FILE_APPEND);
    
  • systemd服务的运行用户没有写入权限
    手动运行时你用的是自己的用户账号,但systemd默认可能用root或者其他系统用户(比如www-data)运行服务,而脚本所在目录的权限不允许这个用户写入。

    有两种解决方式:

    1. 修改systemd服务配置文件(比如your_script.service),指定和手动运行相同的用户:
      [Service]
      User=你的用户名
      Group=你的用户组
      ExecStart=/usr/bin/php /path/to/your/script.php
      
      修改后重启服务生效:sudo systemctl daemon-reload && sudo systemctl restart your_script.service
    2. 给脚本所在目录设置合适的权限,允许服务运行用户写入:
      sudo chown -R 服务运行用户:用户组 /path/to/script/directory
      sudo chmod -R 755 /path/to/script/directory
      
  • SELinux限制(仅适用于CentOS/RHEL系列系统)
    如果你的服务器开启了SELinux,它可能会阻止systemd进程写入普通用户的目录。可以先临时关闭SELinux测试:

    sudo setenforce 0
    

    如果测试后日志能正常写入,就添加SELinux规则允许该目录的写入权限:

    sudo semanage fcontext -a -t httpd_sys_rw_content_t "/path/to/script/directory(/.*)?"
    sudo restorecon -Rv /path/to/script/directory
    
  • PHP环境配置差异
    systemd运行时的PHP环境可能和你手动登录的环境不同,比如open_basedir限制了PHP能写入的路径。可以在脚本开头添加代码检查并调整:

    // 查看当前open_basedir设置(可临时启用查看)
    // echo ini_get('open_basedir');
    // 添加日志目录到允许列表
    ini_set('open_basedir', ini_get('open_basedir') . ':/path/to/script/directory');
    

另外,你可以先通过find命令排查日志是否写到了其他位置,确认问题根源:

sudo find / -name "log_*.txt"

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:23:08