不能从cronjob运行wkhtmltopdf

我有一个命令行..当它从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 

puttywebmin运行命令(没有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永远不会完成

更新II

该命令行无法从cron作业中运行

 xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf -h 

@ Grokify

 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-runwkhtmltopdf在你的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% 

尝试添加STDOUTSTDERR重定向来捕获并检查错误消息。

cronjob可能不会拉动用户的环境,因此不知道$ PATH实际包含什么。 我发现我需要在cron中使用二进制文件的完整路径:

 2 * * * /usr/bin/php -f /var/cronjob.php