【发布时间】:2012-06-19 17:26:13
【问题描述】:
先介绍一些设置背景:
-
我有一个 cronjob,它运行一个名为 worker_cronjob 的 PHP 文件。该文件所做的只是从 git 下载我的工作人员,而 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 中,不知何故它改变了目录的设置方式,就像在没有我调用 chroot 的情况下进行 chroot。
我查看了其他线程,它说它在创建 cronjobs 和运行文件时使用完整路径,但是问题不是我的文件,它们都是通过绝对路径引用的,它正在运行我遇到问题的已安装程序。
绝对路径是否也适用于已安装的应用程序,或者有没有办法打破这个功能,让我恢复只用一个词运行命令的能力?
【问题讨论】:
-
同时使用 ffmpeg 命令的绝对路径,看看会发生什么
-
创建一个在 cronjob 行中调用的 bash 脚本。因此,您可以更轻松地配置 ffmpeg 的调用方式,并且可以模拟 root 或其他用户在具有不同环境的其他 shell 中调用它时会发生什么。
-
确实,似乎我必须做类似的事情,因为在我的 PHP 脚本中使用绝对路径来调用它是很讨厌的。但是是的,使用绝对路径是有效的,在我看来个人非常奇怪的行为,感谢您的帮助:)