【问题标题】:PHP Cronjob changing sh rootPHP Cronjob 更改 sh 根
【发布时间】: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 脚本中使用绝对路径来调用它是很讨厌的。但是是的,使用绝对路径是有效的,在我看来个人非常奇怪的行为,感谢您的帮助:)

标签: php cron crontab


【解决方案1】:

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

可以在Reasons why crontab does not work找到非常详细的答案。

上面链接资源中没有显示的另一种方式是:

* * * * * PATH=/usr/bin; command >> /var/log/command.log

【讨论】:

  • 啊,不错的答案,我知道这适用于文件,但我一直认为应用程序有一些特别之处,看来不是,谢谢 :)
猜你喜欢
  • 2018-02-10
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2015-09-25
  • 2016-01-09
  • 1970-01-01
  • 2011-12-29
  • 2020-04-12
相关资源
最近更新 更多