【问题标题】:Cronjob with php script to execute bash command使用 php 脚本执行 bash 命令的 Cronjob
【发布时间】:2021-11-17 19:07:34
【问题描述】:

我有一个执行这个 php 脚本的 cronjob。 httpStatus 检查工作正常。最大的问题是 bash 命令的执行。 (else) 有什么问题吗?

<?php
    $url = "https://xxx";

  $handle = curl_init($url);
  curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);
  
  /* Get the HTML or whatever is linked in $url. */
  $response = curl_exec($handle);
  
  /* Check for 404 (file not found). */
  $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
  
  if($httpCode == 200) {
      /* Handle 200 here. */
      $output = "Status 200 OK";
  }
  else{
      $output = shell_exec('cd public_html/redmine/ && bundle exec ruby bin/rails server -b webrick -e production -d');
      
  }
  
  curl_close($handle);
  
  /* Handle $response here. */

echo($output);


  ?>

【问题讨论】:

  • Cron从另一个目录(可能是root)运行,所以你需要把你的cd改成绝对路径
  • 如果我理解正确的话:脚本不会在它自己的地方执行......它将在定义 crontab 的目录中执行? @aynber
  • 正确。如果您在crontab -e 中定义了它,它将在用户目录中启动,但如果它是主 cron,则不会。在处理 cron 时使用绝对路径总是很聪明
  • 谢谢你,现在 cronjob 可以完美运行(使用绝对路径)
  • 题外话:你绝对应该使用systemd.timer单位而不是cronjobs。它们为您提供更多控制和灵活性、安全强化选项等。

标签: php bash cron


【解决方案1】:

我建议在 cd 命令上更改为绝对路径,例如:

cd /home/my-user/public_htm/redmine ...

当您运行 PHP 脚本时,相对路径是从执行脚本的位置开始,而不是 PHP 文件的位置。

例如,如果您从 /home/my-user 内部运行 php ./public_html/my-cronjob.php,则当前工作目录 (CWD) 将是 /home/my-user 而不是 /home/my-user/public_html。任何cd 命令都相对于您的 CWD 执行。

可以通过getcwd()查看当前工作目录。

您可以使用__DIR__ 获得相同的结果,它会为您提供 PHP 文件的目录。

if($httpCode == 200) {
    /* Handle 200 here. */
    $output = "Status 200 OK";
} else {
    $serverDir = __DIR__ . "/public_html/redmine";
    $output = shell_exec("cd {$serverDir} && bundle exec ruby bin/rails server -b webrick -e production -d");  
}

【讨论】:

  • 感谢这个解释对我帮助很大:)
  • 不客气!乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2016-12-27
  • 2012-04-12
  • 2015-11-12
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2014-06-28
  • 2017-01-04
相关资源
最近更新 更多