2011-07-07 202 views
2

所以,我成立了一个cronjob运行以下命令:PHP Cronjob - 权限被拒绝?

php /var/www/path/to/cron/do-stuff.php

的路径是正确的。该目录归www-data所有。

的脚本执行以下操作:

chdir(getcwd()); 
echo shell_exec('whoami'); 

$handle = fopen(uniqid('TEST_') . '.tst'); 
fwrite($handle, 'foo'); 
fclose($handle); 

这是输出试图运行cron作业时,我得到:从外壳采用su www-data执行此操作时

www-data 
PHP Warning: fopen(TEST_4e15266d09fa2.tst): failed to open stream: Permission denied 

然而 - 脚本执行得很好,并生成测试文件而不会出现呃逆。

任何想法,为什么这可能是?

编辑:我猜su www-data可能是不必要的,因为PHP将然而运行它运行,但我想,以防万一。尽管如此,您可以从输出中看到cron和脚本作为www-data执行。

回答

4

你有没有试过把完整路径fopen函数,而不是仅仅的文件名?

+0

宾果!我是个白痴。 'getcwd'正在报告'/ usr/share/webmin/cron'。 – Greg

0

我相信,即使这是在cron,PHP本身仍然运行,因为它是默认的用户(这是什么可以改变,当然),这不能合理地改变。我可能是错的。尝试将目录分组到PHP系统用户(apache?)并给予组写入权限。然后看看是否有效。

+0

我虽然'www-data'是php用户?我的意思是,这就是'whoami'所显示的。我只是不明白在一个实例中脚本是如何被阻塞的,而不是在后者中。 – Greg

+1

哪位用户正在运行cron? ..? – arkigos

+0

万维网数据 - 事实证明,这是getcwd,这是问题。 – Greg

2

cron作业以完全不同的方式处理PATH。 如果您未指定PATH,那么在从命令行调用通常工作的相同脚本时,如果从crontab调用它,可能会返回像这样的权限错误。

尝试改变行:

$handle = fopen(uniqid('TEST_') . '.tst'); 

在这样的事情:

$handle = fopen('/var/www/vhosts/yourpath/'.uniqid('TEST_') . '.tst'); 

它为我工作。