if-else-statement在crontab中工作错误?

时间:2014-02-14 12:14:32

标签: bash shell if-statement crontab

当我使用它时:

*/5 6-18 * * 1-6 [ "$(ls -A /DIR_WHERE_FILES_ARE_OR_NOT/)" ] &&
  rsync -au /DIR_WHERE_FILES_ARE_OR_NOT/ /DIR_WHERE_FILES_SHOLD_GO; \
  mv /DIR_WHERE_FILES_ARE_OR_NOT/*  /SAVE_DIR/ ||
  mail -s "DIR IS EMPTY" myemail@klkldkl.de <<< "message"

我收到两封邮件:

  

mv:无法统计`/ DIR_WHERE_FILES_ARE_OR_NOT / *':没有此类文件或   目录

  

“DIR IS EMPTY”

为什么?

3 个答案:

答案 0 :(得分:2)

你得到了

mv: cannot stat `/DIR_WHERE_FILES_ARE_OR_NOT/*': No such file or directory

正是由于所述原因:该目录为空,因此它不包含名为*(星号)的文件。这就是全局扩展在shell中的工作方式:如果glob不匹配任何东西,它会直接传递给命令。由于mv尝试重命名不存在的文件,因此会显示为抱怨。

这将更具可读性,如果不是crontab中的&&||运算符序列,您可以将整个逻辑放在具有等效if/else/fi构造的脚本中,只需从cron调用脚本。

您收到两封邮件,因为您明确发送第一封邮件mail -s。第二个是来自cron,因为stderr和stdout上的输出不为空。

您的命令等同于

if [ "$(ls ...)" ]; then
   rsync
fi
if ! mv; then
   mail
fi

请注意,没有else

答案 1 :(得分:1)

您收到两封邮件,因为当mv失败时,cron会捕获写入标准错误的内容并将其邮寄给所有者,然后运行mail命令。您可以取消mv的错误消息,以避免来自cron的邮件。

mv /DIR_WHERE_FILES_ARE_OR_NOT/*  /SAVE_DIR/ 2> /dev/null || mail -s "DIR IS EMPTY" myemail@klkldkl.de <<< "message"

答案 2 :(得分:1)

就像用户Jens已经提到的那样,而且根据我的经验,除非你使用的是一个非常简单且通常单一的命令,否则你应该坚持使用脚本文件。所以,在你的情况下,我会使用脚本文件。我给你举个例子。

#!/bin/bash

dir_where_files_are_or_not=/filespath
dir_where_files_should_go=/another/filespath
save_dir=/savefiles/path

# ok, lets start by checking if dir contains files
if [ "$(ls -A $dir_where_files_are_or_not)" ]; then
  # dir contains files, so lets rsync and mv them
  rsync -au $dir_where_files_are_or_not/ $dir_where_files_should_go
  mv $dir_where_files_are_or_not/* $save_dir
else
  # dir is empty, lets send email
   mail -s "DIR IS EMPTY" myemail@klkldkl.de <<< "message"
fi

现在,我把这段代码放在一个文件中。给它命名,例如“chkfiles”并将其保存在一个目录中(我使用/ usr / local / sbin表示我的所有脚本)。

接下来,在shell中,运行命令chmod +x /usr/local/sbin/chkfiles以使文件可执行。然后将脚本添加到您的crontab。

我建议在crontab中使用以下行:

*/5 6-18 * * 1-6 /bin/bash /usr/local/sbin/chkfiles

我使用/ bin / bash为这个脚本调用正确的解释器。它应该按预期工作。

重要提示:

  1. 在运行脚本之前,您需要根据需要更改dir_where_files_are_or_notdir_where_files_should_gosave_dir vars。
  2. NOT 在dirs中包含尾部斜杠,否则rsync和mv可能无法执行您真正想要的操作
  3. 此致