【问题标题】:unix `at` from php script, works in shell but not from web来自 php 脚本的 unix `at`,可在 shell 中工作,但不能来自 web
【发布时间】:2014-01-22 19:41:17
【问题描述】:

我无法从 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。可以看到job已经被放置了,这次job属于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

感谢您对此的任何帮助。

【问题讨论】:

  • 我可能理解有误,不过你可以试试把test.pl的权限改成chmod 777。此外,Apache 通常没有所有权,管理员或用户有。

标签: php apache shell


【解决方案1】:

如果作业正在排队,那么我们可以排除 apache uid 被拒绝访问“at”的可能性。

这意味着该作业可能无法执行(您怎么知道它无法运行?)

由于您具有 root 访问权限,下一步将是查看 apache uid 的邮件文件 - 或确定此 uid 的邮件发送到哪里并查看:来自man page

用户将收到来自他的命令的标准错误和标准输出, 如果有的话。邮件将使用命令 /usr/sbin/sendmail 发送

(如果您在那里没有找到任何东西,那么您可能想尝试类似pwd | mail -s test apache 或使用 -m 运行以检查邮件是否得到应有的处理)

通常情况下,守护进程所有者不会配置任何 shell - 您在调用 at 之前是否设置了 $SHELL? (如果是这种情况并且正在发送邮件,那么将有一个相应的错误等待读取)。

您检查了 test.pl 文件的权限,这似乎不是问题(假设未应用 fACL 或 SELinux 限制)。您是否检查过 perl 可执行文件的权限? test.pl 是否正在尝试访问它可能拥有权限的其他文件?

【讨论】:

  • 似乎邮件没有被正确处理,至少当我尝试pwd | mail -s test myusername时我没有收到邮件。如果at 使用 $SHELL 来确定要使用哪个 shell(当我以 root 或任何其他用户身份运行时它是 /bin/bash),那么当我从 apache 运行时,$SHELL 可能没有被设置并且当排队 @ 987654325@作业运行它没有外壳可以使用?
  • 如果还没有为用户配置 $SHELL,您只需设置 $SHELL = 参见 /etc/passwd。注意,如果您的 Apache 没有外壳,请不要更改 /etc/passwd - 在运行之前设置 $SHELL。并修复您的邮件。 (请记住,您正在尝试为 Apache uid 整理 RECEIVING MAIL)
猜你喜欢
  • 2014-05-12
  • 2020-12-12
  • 2018-12-17
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多