![“du:未找到命令” - 由 CRON 作业执行](https://linux22.com/image/107353/%E2%80%9Cdu%EF%BC%9A%E6%9C%AA%E6%89%BE%E5%88%B0%E5%91%BD%E4%BB%A4%E2%80%9D%20-%20%E7%94%B1%20CRON%20%E4%BD%9C%E4%B8%9A%E6%89%A7%E8%A1%8C.png)
我有一个安全摄像头,它将捕获的图片发送到网络上的 ftp 服务器,并且我开发了一个脚本来删除接收目录中的旧文件。从命令行启动时,该脚本运行良好,因此我在 crontab 中添加了一行以每天执行该脚本两次。
# Remove old security images / videos from directory
1 7,19 * * * /home/ftp/bin/secpurg
但该脚本不起作用。该目录已满,因此我决定使用 #!/bin/bash -x 执行以查看发生了什么。我的邮件中开始出现以下消息:
+ fileAge=10
+ SecDir=/home/ftp/_Security/
+ maxDirSize=3000000
++ du -s /home/ftp/_Security/
++ cut -f1
/home/ftp/bin/secpurg: line 11: cut: command not found
/home/ftp/bin/secpurg: line 11: du: command not found
+ secDirSize=
+ '[' -ge 3000000 ']'
/home/ftp/bin/secpurg: line 14: [: -ge: unary operator expected
胡?通过 CRON 执行脚本时找不到“cut”和“du”?谁能告诉我一些关于为什么当我从终端执行脚本时这些命令工作得很好,但当它从 CRON 执行时却不行?
如果有用,我提供了脚本供参考:
#!/bin/bash -x
# secpurg - find and remove older security image files.
# Variable decleration
fileAge=10
SecDir="/home/ftp/_Security/"
maxDirSize=3000000
# Determine the size of $SecDir
secDirSize=`du -s $SecDir | cut -f1`
# If the size of $SecDir is greater than $maxDirSize ...
while [ $secDirSize -ge $maxDirSize ]
do
# remove files of $fileAge days old or older ...
find $SecDir* -mtime +$fileAge -exec rm {} \;
# Generate some output to email a report when files are deleted.
# set -x
# Expanding $SecDir* makes for big emails, so we don't do that, but echo the command for reference ...
echo -e "\t\t[ $secDirSize -ge $maxDirSize ]
fileAge=$fileAge
SecDir=$SecDir
maxDirSize$maxDirSize
find $SecDir* -mtime +$fileAge -exec rm {} \;"
# decrement $fileAge ...
fileAge=$(( $fileAge - 1 ))
# and re-determine the size of $SecDir.
secDirSize=`du -s $SecDir | cut -f1`
# Just in case things are crazy, don't delete todays files.
if [ $fileAge -le 1 ]
then
secDirSize=0
fi
# Stop generating output for email.
# set +x
done
--
编辑:
添加echo "PATH -$PATH-"
到脚本顶部会导致电子邮件的第一行为:+ echo 'PATH -~/bin:$PATH-'
。所以现在我的问题是,我的 PATH 发生了什么,以及向其中添加有用目录的推荐方法是什么?我认为这会影响我所有的 CRON 工作。
--
答案1
它是在交互式会话中工作的,所以我猜测这是cron
.
PATH=
确保您的 中没有一行crontab
,如果您这样做,它包含显式目录(cron
路径分配不像 shell 那样是附加的)
PATH=/home/myhomedir/bin:/usr/local/bin:/bin:/usr/bin
答案2
由于 echoing$PATH
给出~/bin:$PATH
,您的文件中很可能有~/.bashrc
类似的内容
PATH='~/bin:$PATH'
这设置PATH
为文字字符串~/bin:$PATH
,其中由于单引号,$PATH
永远不会扩展为分配之前的路径。
将单引号更改为双引号。