【发布时间】: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。它们为您提供更多控制和灵活性、安全强化选项等。