使用nohup持续运行多个PHP脚本并生成独立日志的权限问题及实现方法求助
nohup持续运行多个PHP脚本并生成独立日志的权限问题及实现方法求助
我明白你现在的需求——要让5个PHP脚本在后台持续运行,即使关掉终端也不中断,每个脚本还要生成自己的日志文件,但遇到了权限问题对吧?先帮你分析下你之前遇到的错误,再给你一套可行的解决方案。
先分析你遇到的权限错误原因
- 第一个命令
sudo nohup php send-mail.php > mail.txt:这里的sudo只作用于nohup和php命令,但重定向符号>是由当前普通用户执行的。如果当前目录你没有写入权限,就会触发Permission denied,因为写入mail.txt的操作没用到sudo权限。 - 第二个命令
nohup php send-mail.php > sudo mail.txt:这是命令语法错误,重定向后面不能加sudo,系统会误以为你要把输出写到名为sudo的文件,同时把mail.txt当作额外参数,自然会报错。
正确的实现方案
根据你的脚本是否需要root权限,分两种情况处理:
情况1:脚本不需要root权限即可运行
直接在你有写入权限的目录(比如用户家目录~/)执行命令,或者指定一个有权限的路径存储日志:
nohup php /path/to/your/send-mail.php > ~/mail.log 2>&1 &
参数解释:
2>&1:把错误输出也重定向到日志文件,这样脚本的正常输出和错误信息都会被记录下来- 末尾的
&:让命令在后台运行(nohup本身已支持后台,加&更稳妥)
要同时运行5个脚本,逐个执行即可:
nohup php /path/to/script1.php > ~/script1.log 2>&1 & nohup php /path/to/script2.php > ~/script2.log 2>&1 & nohup php /path/to/script3.php > ~/script3.log 2>&1 & nohup php /path/to/script4.php > ~/script4.log 2>&1 & nohup php /path/to/script5.php > ~/script5.log 2>&1 &
情况2:脚本必须用root权限运行
如果脚本需要root权限才能执行,要让重定向操作也以root身份执行,推荐用以下两种方法:
- 方法一:用
sudo sh -c包裹整个命令,确保所有操作都用root权限:
sudo sh -c "nohup php /path/to/send-mail.php > /var/log/mail.log 2>&1 &"
可以把日志放到系统日志目录(比如/var/log/),root默认有权限写入这里。多个脚本同理:
sudo sh -c "nohup php /path/to/script1.php > /var/log/script1.log 2>&1 &" sudo sh -c "nohup php /path/to/script2.php > /var/log/script2.log 2>&1 &" sudo sh -c "nohup php /path/to/script3.php > /var/log/script3.log 2>&1 &" sudo sh -c "nohup php /path/to/script4.php > /var/log/script4.log 2>&1 &" sudo sh -c "nohup php /path/to/script5.php > /var/log/script5.log 2>&1 &"
- 方法二:先创建日志文件并修改权限(相对繁琐):
- 先创建日志文件:
sudo touch /var/log/mail.log - 修改文件权限让当前用户可写:
sudo chown your_username:your_username /var/log/mail.log - 再运行nohup命令:
sudo nohup php send-mail.php > /var/log/mail.log 2>&1 &
- 先创建日志文件:
实用小技巧
- 查看后台运行的PHP脚本:用
ps aux | grep php找到进程信息 - 停止某个脚本:找到进程PID(
ps aux输出的第二列),执行kill PID;如果无法终止,用kill -9 PID强制停止 - 若需要脚本开机自动运行,可以把命令添加到crontab(
@reboot前缀),或者配置成systemd服务(更稳定,适合长期运行)
备注:内容来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

