首先设置一些背景:
我有一个运行名为worker_cronjob的PHP文件的cronjob。所有文件都是从git下载我的worker,而cron.d中的cronjob看起来像是:
* / 1 * * * * ubuntu / home / ubuntu / worker_cronjob>> /home/ubuntu/worker.log
它包含worker_despatcher文件
使用(ROOT是我目录的支路)来触发子进程:
$ PID = exec(sprintf(“%s>%s 2>& 1& echo $!”,“php”.ROOT。“/ worker / encoder.php”。$ arg_string,ROOT。“ /worker/encoder.log“));
问题是在cronjob下这个方法正在改变系统命令的运行方式,更具体地说是sh。所以当我运行像:
这样的命令时ffmpeg
它返回:
sh: 1: ffmpeg: command not found
在跟踪和错误之后我发现这只发生在cronjob上,不知何故它改变了目录的设置方式,就像chrooting没有我调用chroot一样。
我已经查看了其他线程,它说它在创建cronjobs和运行文件时使用完整路径,但是这不是我的文件是问题,它们都是通过绝对路径引用的,它运行安装的程序,我遇到问题。
绝对路径是否也适用于已安装的应用程序,或者有没有办法打破此功能,让我能够只用一个单词运行命令?
答案 0 :(得分:1)
背后的原因是cronjobs
由系统运行,因此他们对您的shell或用户环境变量一无所知。您可以说它们在最小环境中运行。
可以在Reasons why crontab does not work中找到详细的答案。
上述链接资源中未显示的另一种方式是:
* * * * * PATH=/usr/bin; command >> /var/log/command.log