crontab 定时执行 bash 脚本报错:[: -gt: unary operator expected

#!/bin/sh  
filesize=`ls -l nohup.out | awk '{ print $5 }'`
echo "`date +%Y-%m-%d_%H:%M:%S` fileSize: $filesize bit" >> clearNohup.log
if [ $filesize -gt 1073741824 ]
then
    echo "`date +%Y-%m-%d_%H:%M:%S` $filesize bigger than 1G, we will back up and clear..." >> clearNohup.log
    cp -f nohup.out nohup.out.bak
    > nohup.out
    echo "`date +%Y-%m-%d_%H:%M:%S` file back up and claer over!" >> clearNohup.log
else
    echo "`date +%Y-%m-%d_%H:%M:%S` $filesize less than 1G,do nothing!" >> clearNohup.log
fi

手动执行时候没有报错,正常执行;在crontab执行时候一直在报错.
系统是centOS6
报错:
clearNohup.sh: line 4: [: -gt: unary operator expected
求大神指点!

阅读 4.5k
1 个回答

把这句:

filesize=`ls -l nohup.out | awk '{ print $5 }'`

改为这样:

filesize=`ls -l /absolute/path/to/nohup.out | awk '{ print $5 }'`

要注意的是 crontab 的环境变量和我们的账号都不一样, 和 root 的环境变量也不一样.
类似普通用户会先加载 ~/.bashrc 或者 /etc/profile, crontab 则会在运行时加载 /etc/crontab 导入其环境变量.
而你的问题还不是环境变量的问题. 但类似. 用 crontab 执行, 最好脚本内都用绝对路径.

另外, 即使你第4行过了, 下面几个使用相对路径的地方仍然会出错的.

另外, 统计文件大小为何不用 du 命令, 用 ls 连管道再解析多费事啊.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题