我有一个命令行..当它从putty
运行它的作品,但是当运行命令从一个cronjob(webmin)作为root
运行的命令挂起,永远不会执行..
/usr/bin/xvfb-run -a -s "-screen 0 640x480x16" /usr/bin/wkhtmltopdf /root/input.html /root/output.pdf
cronjob.php
命令行
echo shell_exec('/usr/bin/xvfb-run -a -s "-screen 0 640x480x16" /usr/bin/wkhtmltopdf /root/input.html /root/output.pdf');
cron作业命令(以root
身份运行)
php -f /var/cronjob.php
当cron作业从webmin
运行时,执行永远不会完成,但是当从putty
运行完全相同的命令时,它就起作用了! 这是输出
Loading page (1/2) Printing pages (2/2) Done Exit with code 1 due to network error: ProtocolUnknownError
从putty
和webmin
运行命令(没有wkhtmltopdf)
echo shell_exec('/usr/bin/xvfb-run -a -s "-screen 0 640x480x16"');
这是输出
xvfb-run: usage error: need a command to run Usage: xvfb-run [OPTION ...] COMMAND Run COMMAND (usually an X client) in a virtual X server environment. ...
当添加wkhtmltopdf
cronjob永远不会完成
该命令行无法从cron作业中运行
xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf -h
echo shell_exec('0 0 * * * * xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf /var/www/tmp/test.html /var/www/tmp/output.pdf >> /var/www/tmp/pdf.log 2>> /var/www/tmp/pdf.err');
pdf.err
sh: 1: 0: not found
cron
运行的用户是什么? 这可能是一个权限问题。 尝试使用sudo
来给力来创建完整的文件。
所以在cron
有
sudo xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf input.html output.pdf
你应该考虑把xvfb运行成像/usr/bin/xvfb-run
或者/bin/xvfb-run
这样的完整路径,并且当你指定input.html和output.pdf时,试着把它的完整路径如/home/user/Documents/input.html /home/user/Documents/output.pdf
我会假设cron的(简化)环境出现问题,随后是xauth。
顺便说一下,我会努力取得进展
(a)使用xvfb-run的选项--error-file=/tmp/xvfb.log
查看它说的是什么,
(b)使用xvfb-run选项--auth-file=/path/to/root_s_home/.Xauthority
另一种方式可能是从源头上安装wkthtmltopdf
以获得真正的“无头”程序,而不需要xvfb-run
(这些只是建议 – 我没有机会建立测试场景…)
以下PHP和crontab示例对我来说都是非特权用户和特权用户。 该示例将STDOUT
重定向到/tmp/pdf.log
,将STDERR
重定向到/tmp/pdf.err
以捕获并检查日志记录和错误消息。 这个例子假设xvfb-run
和wkhtmltopdf
在你的PATH中,也可以被硬编码。
PHP
echo shell_exec('xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf /var/www/tmp/test.html /var/www/tmp/output.pdf >> /var/www/tmp/pdf.log 2>> /var/www/tmp/pdf.err');
crontab中
0 0 * * * xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf /var/www/test.html /var/www/output.pdf >> /var/www/tmp/pdf.log 2>> /var/www/tmp/pdf.err
标准输出:wkhtmltopdf成功
运行时,以下出现在/var/www/tmp/pdf.log
表示成功,错误文件保持为空:
$ cat /var/www/tmp/pdf.log Loading page (1/2) Printing pages (2/2) Done
STDOUT:wkhtmltopdf错误
如果有一个wkhtmltopdf
错误,它wkhtmltopdf
出现在STDOUT
中。 如果输入文件( /var/www/tmp/test.html
)不存在,以下是test.html
文件未找到错误的示例:
$ cat /var/www/tmp/pdf.log Loading page (1/2) Error: Failed loading page http:///var/www/tmp/test.html (sometimes it will work just to ignore this error with --ignore-load-errors) [============================================================] 100%
尝试添加STDOUT
和STDERR
重定向来捕获并检查错误消息。
cronjob可能不会拉动用户的环境,因此不知道$ PATH实际包含什么。 我发现我需要在cron中使用二进制文件的完整路径:
2 * * * /usr/bin/php -f /var/cronjob.php