求助:Apache2启动时自动运行PHP脚本恢复服务器状态
解决Apache启动时自动运行PHP恢复脚本的问题
让我帮你一步步排查并解决这个问题,先从你当前的配置问题入手,再给你更可靠的替代方案:
一、先修复你/etc/init.d/apache2配置的错误
你当前的修改有两个明显的语法问题,导致脚本根本不会被执行:
- 多余的
;;符号:do_start()是普通函数,不是case分支,你加的;;是case语句的分隔符,会导致语法错误,Apache启动时会跳过这行命令。把php -q /var/www/scripts/testing.php & ;;改成php -q /var/www/scripts/testing.php &。 - restart分支的命令位置错误:你把PHP执行命令放在了
esac(case语句结束标记)之后,这行代码永远不会被执行,应该把它移到do_start执行成功的分支里。
除此之外,还要先解决脚本本身的问题:
你的PHP脚本里$timestamp变量没定义,会触发PHP警告,导致日志写入失败。修改脚本:
<?php $timestamp = date('Y-m-d H:i:s'); file_put_contents('/var/www/html/log', "301,$timestamp,Recreating all connections after restart,N/A\n", FILE_APPEND); ?>
二、必须检查的权限问题
Apache默认以www-data用户运行,所以要确保:
- 脚本文件有可执行权限:
sudo chmod 755 /var/www/scripts/testing.php - 日志目录/文件有写入权限:
sudo chown www-data:www-data /var/www/html/log - 用完整的PHP路径:避免系统找不到PHP命令,先执行
which php找到完整路径(比如/usr/bin/php),替换命令里的php。
三、更可靠的方案:用Systemd服务(替代init.d)
init.d已经是比较老旧的启动方式,Systemd更稳定且易维护,不需要用screen/nohup/disown,Systemd本身可以管理进程。
步骤1:创建Systemd服务文件
新建/etc/systemd/system/php-recovery.service,内容如下:
[Unit] Description=Run PHP recovery script after Apache starts After=apache2.service Requires=apache2.service [Service] Type=oneshot User=www-data Group=www-data ExecStart=/usr/bin/php -q /var/www/scripts/testing.php # 把脚本输出写入系统日志,方便排查问题 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
步骤2:启用并测试服务
# 重新加载Systemd配置 sudo systemctl daemon-reload # 设置开机自动启动 sudo systemctl enable php-recovery.service # 手动测试一次 sudo systemctl start php-recovery.service
验证效果
执行完手动测试后,查看日志文件是否有内容,或者用journalctl -u php-recovery.service查看脚本执行的详细输出,排查是否有错误。
四、快速测试脚本的方法
在调整配置前,先手动以www-data用户运行脚本,验证脚本本身能正常工作:
sudo -u www-data php /var/www/scripts/testing.php
如果日志还是没写入,检查脚本语法:
sudo -u www-data php -l /var/www/scripts/testing.php
内容的提问来源于stack exchange,提问作者Monocito
相关产品推荐
相关产品推荐

