我无法从php webscript执行unix at
作业命令。
at
作业的php看起来像这样:
$output=exec('echo "/usr/bin/perl /home/dir/test.pl" | /usr/bin/at now +1minute')
这可以在shell命令提示符下正常工作。我可以执行php脚本,运行atq
以查看该作业已设置且作业属于root。然后等待并确认test.pl脚本已运行。 test.pl脚本对数据库执行简单更新,我可以检查以确认一切正常。
当我从网上执行php脚本时,请返回我的shell并再次运行atq
。我可以看到这份工作已被放置,这次工作属于apache,所以一切似乎都很好。但是在等待预定的时间之后,test.pl脚本没有执行,我看到对db的更新没有起作用后我可以确认。
我相信这一定是权限问题,但我不确定。我尝试将/ home / dir和test.pl脚本所有权授予apache,但这仍然无效。我尝试在webroot文件夹中创建一个符号链接到/ home / dir,但这似乎也没有帮助。我不太了解apache权限,所以我可能会忽略一些东西。
这是目录和test.pl ls -l
输出
/home/dir
drwxrwxr-x 2 apache apache
test.pl
-rwxr-xr-x 1 apache apache
感谢您对此提供任何帮助。
答案 0 :(得分:0)
如果作业正在排队,那么我们可以忽略apache uid被拒绝访问'at'的可能性。
这意味着该作业可能无法执行(您怎么知道它无法运行?)
由于您具有root访问权限,因此下一步是查看apache uid的邮件文件 - 或者确定此uid的邮件发送到哪里并查看:man page:
用户将通过命令邮寄标准错误和标准输出, 如果有的话。邮件将使用命令/ usr / sbin / sendmail
发送
(如果你在那里找不到任何东西,那么你可能想尝试像pwd | mail -s test apache
这样的东西或者用-m运行来检查邮件是否得到应有的处理)
通常,守护程序所有者不会配置任何shell - 在调用之前是否设置了$ SHELL? (如果是这种情况并且邮件正在发送,则会有相应的错误等待阅读。)
您已经检查了test.pl文件的权限,但这似乎不是问题(假设未应用fACL或SELinux限制)。你检查过perl可执行文件的权限吗? test.pl是否可以尝试访问其可能具有权限的其他文件?