unix`at`来自php脚本,在shell中工作,但不来自web
从php webscript执行unixunix`at`来自php脚本,在shell中工作,但不来自web,php,apache,shell,Php,Apache,Shell,从php webscript执行unixatjob命令时遇到问题。 带有at作业的php如下所示: $output=exec('echo "/usr/bin/perl /home/dir/test.pl" | /usr/bin/at now +1minute') 这在shell命令提示符下可以正常工作。我可以执行php脚本,运行atq,查看作业是否已设置,作业是否属于root用户。然后等待并确认test.pl脚本已运行。pl脚本对数据库执行一个简单的更新,我可以检查该数据库以确认一切正常 当我
at
job命令时遇到问题。
带有at
作业的php如下所示:
$output=exec('echo "/usr/bin/perl /home/dir/test.pl" | /usr/bin/at now +1minute')
这在shell命令提示符下可以正常工作。我可以执行php脚本,运行atq
,查看作业是否已设置,作业是否属于root用户。然后等待并确认test.pl脚本已运行。pl脚本对数据库执行一个简单的更新,我可以检查该数据库以确认一切正常
当我从web执行php脚本时,返回shell并再次运行atq
。我可以看到作业已被放置,这次作业属于apache,因此一切似乎都很好。但是在等待计划的时间之后,test.pl脚本没有执行,我可以在看到数据库的更新没有工作之后确认这一点
我相信这一定是权限问题,但我不确定。我尝试将/home/dir和test.pl脚本的所有权提供给apache,但仍然不起作用。我尝试在webroot文件夹中创建指向/home/dir的符号链接,但这似乎也没有帮助。我不知道apache的权限,所以我可能会忽略一些东西
这是目录和test.plls-l
output
/home/dir
drwxrwxr-x 2 apache apache
test.pl
-rwxr-xr-x 1 apache apache
感谢您在这方面的帮助。如果作业正在排队,那么我们可以忽略apache uid被拒绝访问“at”的可能性 这意味着作业可能无法执行(您如何知道它无法运行?) 由于您具有root访问权限,下一步将是查看apache uid的邮件文件,或者确定此uid的邮件发送到何处,然后查看: 用户将收到来自其命令的标准错误和标准输出, 如果有的话。邮件将使用/usr/sbin/sendmail命令发送 (如果您在那里找不到任何东西,那么您可能希望尝试类似于
pwd | mail-s test apache
或运行with-m来检查邮件是否得到了应有的处理)
通常守护程序所有者不会配置任何shell-在调用之前是否设置了$shell?(如果是这种情况,并且邮件正在发送,那么将有一个相应的错误等待读取)
您已经检查了test.pl文件的权限,这似乎不是问题所在(假设没有应用fACLs或SELinux限制)。您是否检查了perl可执行文件的权限?test.pl是否可以尝试访问它可能拥有权限的其他文件?我可能误解了,但您可以尝试将
test.pl
的权限更改为chmod 777
。此外,Apache通常没有所有权,管理员或用户没有。邮件似乎没有得到正确处理,至少当我尝试pwd | mail-s test myusername时,我没有收到邮件。如果at
使用$SHELL确定要使用哪个SHELL(当我以root用户或任何其他用户身份运行时,它是/bin/bash)当我从apache运行时,是否可能没有设置$SHELL?当排队的at
作业运行时,是否可能没有可使用的SHELL?如果没有为user=see/etc/passwd配置的SHELL,则只需要设置$SHELL。注意:如果您的Apache没有shell,请在运行之前不要更改/etc/passwd-set$shell。并修复您的邮件。(请记住,您正在尝试为ApacheUID整理接收邮件)