我对smartctl有问题
已从版本5.4更新到最新版本6.4。。没有变化。。同一问题
当直接从命令行运行命令smartctl -H /dev/sda时,它可以正常工作
但是当从cronjob运行命令时,它并没有正常工作。在这里您可以看到cron作业设置。。其运行方式为root
测试时,作业每60秒运行一次,命令不返回任何内容。只有时间戳被写入文件。
但如果我按下“立即运行”按钮,那么命令就可以工作了?!很奇怪!?在代码中,您可以看到输出被写入文件。。输出为空
另一件事。。当作业自动执行时,只有一个时间戳写入文件。。应该写两个时间戳?

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脚本正在运行,php可执行文件在cron任务本身中找到,但是smartctl可能在PHP脚本中找不到。
使用smartctl找到which smartctl的完整路径,然后修改PHP脚本以使用完整路径。可能/usr/bin/smartctl/usr/sbin/smartctl
使用shell_exec()使从调用的命令检索错误信息变得困难。相反,使用exec()并指定第三个参数$return_var来捕获返回代码,以及$output数组可能更有用。

关于php - smartctl不能从cron工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30889246/

10-13 05:23