使用crontab以www-data身份从bash脚本执行php文件

4
我将尝试使用crontab在每晚特定时间运行一个php文件,但是由于目录权限的原因,该php文件需要以www-data身份运行。为了以www-data身份运行,我正在使用root crontab并在其中更改用户,如下所示: * 20 * * * sudo -u www-data /usr/bin/env TERM=xterm /path/to/dailyProc.sh dailyProc的内容如下:
today=`date +"%d%m%y"`

year=`date +"%y"`

dm=`date +"%m%d"`

`tar -zxf /path/to/input/$today.tgz -C /path/to/output`

echo "starting data proc"

`/usr/bin/php5 -f /path/to/dataproc.php date=$dm year=$year`

echo "data proc done"

dailyProc.sh中的所有其他命令都有效,但php无法运行。该php使用输出缓冲区并将其写入文件,在命令行调用时可以正常工作,但在通过cron调用时无法工作。

我也可以使用以下命令从命令行以www-data身份运行dailyProc.sh:

sudo -u www-data dailyProc.sh

一切都按预期工作。

是否有任何原因导致我无法在crontab中运行dailyProc.sh中的此php文件,而其中的其他所有内容均可正常工作?


你的脚本中使用 #!/bin/bash 吗? - Alex
请检查 crontab -l 以确保您的 crontab 已注册。此外,请检查日志,可能位于 /var/log/syslog - John Cartwright
@alex,脚本中除此之外都运行正常,我需要它吗?还是说这只是更好的实践方法?我使用 sudo contab -e 来编辑 crontab。我读到过编辑 etc/crontab 不是一个好主意,因为系统可能会覆盖它。 - Cob50nm
@JohnCartwright 两者都表明正在运行 dailyProc.sh,确实是这样,但其中的 php 却没有被执行。 - Cob50nm
@Cob50nm:没有一个像样的系统会覆盖/etc/crontab - lxg
显示剩余2条评论
4个回答

2
Cron也可以按用户运行。
crontab -u www-data -e

1
这对我有效:
* 20 * * * su - www-data -C "/path/to/dailyProc.sh"

这返回了以下错误 /usr/bin/env: 语法错误: 意外的单词(期望")") - Cob50nm

1

在crontab条目中,您不需要使用susudo,因为第6列已经是用于用户名的。而且您也不需要启动终端,因为您无法看到它。因此,以下内容应该足够:

* 20 * * * www-data /path/to/dailyProc.sh

你在评论中提到的语法错误:意外的单词...似乎出现在你的代码中。尝试从命令行运行脚本,并从那里开始调试。


如果您直接编辑/etc/crontab,用户是否只是一个参数?当我尝试使用sudo crontab -e时,我收到以下错误信息:/bin/sh: 1: www-data: not found - Cob50nm
1
当您使用 crontab -e 时,您正在创建/编辑一个个人 crontab。然后用户列未被使用,第6列已经是命令。如果您希望脚本由不同的用户执行,请直接编辑 /etc/crontab - lxg

0

为了实现这个,我在dailyProc.sh中使用了curl命令

today=`date +"%d%m%y"`

year=`date +"%y"`

dm=`date +"%m%d"`

`tar -zxf /path/to/input/$today.tgz -C /path/to/output`

echo "starting data proc"

`/usr/bin/curl "myserver.com/dataproc.php?date=$dm?year=$year"`

echo "data proc done"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接