smartctl 不能从 cron 工作
smartctl not working from cron job
我有问题 smartctl
已从 5.4 版本更新到最新的 6.4 版本..没有变化..同样的问题
直接从命令行运行命令smartctl -H /dev/sda
时工作正常
但是当 运行 来自 cronjob 的命令无法正常工作时。在这里您可以看到 cron 作业设置。它的 运行 为 root
作业在测试时每 60 秒 运行 一次,而命令没有 return 任何内容。只有时间戳被写入文件。
但是如果我现在按下按钮“运行”,那么命令会起作用吗?!很奇怪!?在代码中,您可以看到输出已写入文件。输出为空
另一件事.. 当作业自动化时,只有一个时间戳写入文件.. 应该写入两个时间戳?
function check_dev($dev){
$status_ok = "=== START OF READ SMART DATA SECTION ===\nSMART overall-health self-assessment test result: PASSED";
$output = shell_exec('smartctl -H '.$dev);
file_put_contents('/var/www/hdd_out.txt', gmdate("M d Y H:i:s", time())."\n".$output, FILE_APPEND);
if(strpos($output, $status_ok) !== false){
echo "$dev OK!\n";
return true;
}
else{
echo "$dev ERROR!\n";
return false;
}
}
if(check_dev('/dev/sda') && check_dev('/dev/sdb')){
$status = 0;
}
else{
$status = 1;
}
输出文件
Jun 17 2015 10:17:01
Jun 17 2015 10:18:01
Jun 17 2015 10:19:01
Jun 17 2015 10:20:01
Jun 17 2015 10:21:01
Jun 17 2015 10:22:01
Jun 17 2015 10:23:01
Jun 17 2015 10:24:01
Jun 17 2015 10:25:01
Jun 17 2015 10:26:01
Jun 17 2015 10:27:01
Jun 17 2015 10:28:01
Jun 17 2015 10:29:01
Jun 17 2015 10:29:54 # here I manually pressed "Run now"
smartctl 6.4 2014-09-29 r3990 [x86_64-linux-2.6.32-5-amd64] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Jun 17 2015 10:29:54 # here I manually pressed "Run now"
smartctl 6.4 2014-09-29 r3990 [x86_64-linux-2.6.32-5-amd64] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Jun 17 2015 10:30:01
Jun 17 2015 10:31:01
Jun 17 2015 10:32:01
Jun 17 2015 10:33:01
运行 cron 的用户和环境通常比您登录 TTY 时习惯的环境更受限制。特别是,$PATH
环境变量可能不同甚至为空。
因此建议使用您在脚本中调用的任何可执行文件的完整路径。由于 cron 脚本 是 运行,因此可以在 cron 任务本身中找到 php
可执行文件,但可能找不到 smartctl
PHP 脚本。
使用 which smartctl
找到 smartctl
的完整路径,然后修改 PHP 脚本以使用完整路径。很可能 /usr/bin/smartctl
或 /usr/sbin/smartctl
.
使用 shell_exec()
使得很难从调用的命令中检索错误信息。相反,使用 exec()
并指定第三个参数 $return_var
来捕获 return 代码以及 $output
数组可能更有帮助。
我有问题 smartctl
已从 5.4 版本更新到最新的 6.4 版本..没有变化..同样的问题
直接从命令行运行命令smartctl -H /dev/sda
时工作正常
但是当 运行 来自 cronjob 的命令无法正常工作时。在这里您可以看到 cron 作业设置。它的 运行 为 root
作业在测试时每 60 秒 运行 一次,而命令没有 return 任何内容。只有时间戳被写入文件。
但是如果我现在按下按钮“运行”,那么命令会起作用吗?!很奇怪!?在代码中,您可以看到输出已写入文件。输出为空
另一件事.. 当作业自动化时,只有一个时间戳写入文件.. 应该写入两个时间戳?
function check_dev($dev){
$status_ok = "=== START OF READ SMART DATA SECTION ===\nSMART overall-health self-assessment test result: PASSED";
$output = shell_exec('smartctl -H '.$dev);
file_put_contents('/var/www/hdd_out.txt', gmdate("M d Y H:i:s", time())."\n".$output, FILE_APPEND);
if(strpos($output, $status_ok) !== false){
echo "$dev OK!\n";
return true;
}
else{
echo "$dev ERROR!\n";
return false;
}
}
if(check_dev('/dev/sda') && check_dev('/dev/sdb')){
$status = 0;
}
else{
$status = 1;
}
输出文件
Jun 17 2015 10:17:01
Jun 17 2015 10:18:01
Jun 17 2015 10:19:01
Jun 17 2015 10:20:01
Jun 17 2015 10:21:01
Jun 17 2015 10:22:01
Jun 17 2015 10:23:01
Jun 17 2015 10:24:01
Jun 17 2015 10:25:01
Jun 17 2015 10:26:01
Jun 17 2015 10:27:01
Jun 17 2015 10:28:01
Jun 17 2015 10:29:01
Jun 17 2015 10:29:54 # here I manually pressed "Run now"
smartctl 6.4 2014-09-29 r3990 [x86_64-linux-2.6.32-5-amd64] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Jun 17 2015 10:29:54 # here I manually pressed "Run now"
smartctl 6.4 2014-09-29 r3990 [x86_64-linux-2.6.32-5-amd64] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Jun 17 2015 10:30:01
Jun 17 2015 10:31:01
Jun 17 2015 10:32:01
Jun 17 2015 10:33:01
运行 cron 的用户和环境通常比您登录 TTY 时习惯的环境更受限制。特别是,$PATH
环境变量可能不同甚至为空。
因此建议使用您在脚本中调用的任何可执行文件的完整路径。由于 cron 脚本 是 运行,因此可以在 cron 任务本身中找到 php
可执行文件,但可能找不到 smartctl
PHP 脚本。
使用 which smartctl
找到 smartctl
的完整路径,然后修改 PHP 脚本以使用完整路径。很可能 /usr/bin/smartctl
或 /usr/sbin/smartctl
.
使用 shell_exec()
使得很难从调用的命令中检索错误信息。相反,使用 exec()
并指定第三个参数 $return_var
来捕获 return 代码以及 $output
数组可能更有帮助。