0

首先是一些设置背景:

  • 我有一个 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 和运行文件时使用完整路径,但是问题不是我的文件,它们都是通过绝对路径引用的,它正在运行我遇到问题的已安装程序。

绝对路径是否也适用于已安装的应用程序,或者有没有办法打破这个功能,让我恢复使用一个单词运行命令的能力?

4

1 回答 1

1

背后的原因是它们cronjobs由系统运行,因此它们对您的 shell 或用户环境变量一无所知。你可以说它们在最小的环境中运行。

可以在crontab 不起作用的原因中找到非常详细的答案。

上述链接资源中未显示的另一种方式是:

* * * * * PATH=/usr/bin; command >> /var/log/command.log
于 2012-06-17T12:10:44.717 回答