首先是一些设置背景:
我有一个 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 的情况下进行 chrooting。
我查看了其他线程,它说它在创建 cronjobs 和运行文件时使用完整路径,但是问题不是我的文件,它们都是通过绝对路径引用的,它正在运行我遇到问题的已安装程序。
绝对路径是否也适用于已安装的应用程序,或者有没有办法打破这个功能,让我恢复使用一个单词运行命令的能力?