2014-02-14 111 views
1

当我使用这个:如果其他语句在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" [email protected] <<< "message" 

我得到两个邮件:

MV:不能STAT`/ DIR_WHERE_FILES_ARE_OR_NOT/*“:没有这样的文件或 目录

“DIR IS EMPTY”

为什么?

+2

怎么样有这些条件合适的剧本,并从crontab中调用?像这样,跟踪和维护非常复杂。 – fedorqui

+0

谢谢! :)现在我已经改变了两个命令到{}但它不帮助 – user3310114

+0

只有当我的广告 退出0; 后面的两个表彰,我doent得到任何错误的邮件但是当文件在DIR我得到一个错误信息: /bin/sh:-c:line 0:语法错误附近意外的令牌'}' – user3310114

回答

2

你得到

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

整整陈述的理由:该目录是空的,所以它不包含名为*(星号)文件。这只是glob在shell中的工作方式:如果glob不匹配任何内容,它会直接传递给命令。由于mv试图重命名一个不存在的文件,因此如图所示抱怨。

这都将是更可读的,如果不是的&&||运营商在一个crontab的顺序,你会放在整个逻辑在脚本中具有同等if/else/fi结构并调用从cron脚本。

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

你的命令同

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

注意,没有else

+0

但为什么crontab不只是if语句或else语句? – user3310114

+1

由于'&&'与'||'的优先权。 – Jens

+0

澄清,因为与分号结合的短路语义。在shell语法中,分号使这两个独立的*和 - 或列表*。在第二个列表中,'mv || mail',两者都运行,因为'mv'失败。 – Jens

1

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

mv /DIR_WHERE_FILES_ARE_OR_NOT/* /SAVE_DIR/ 2> /dev/null || mail -s "DIR IS EMPTY" [email protected] <<< "message" 
+0

当'mv'失败时,'mv'写入stderr,而不是'cron'。 – Jens

+0

我知道我的措辞很差,但没有意识到只有*如何*糟糕。 – chepner

0

就像用户的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" [email protected] <<< "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 

我用/斌/庆典呼吁该脚本正​​确解释。它现在应该按预期工作。

重要提示:

  1. 运行脚本之前,您需要更改dir_where_files_are_or_notdir_where_files_should_gosave_dir瓦尔您的需求。
  2. 包括在迪尔斯尾随斜杠,否则的rsync和mv可能不会做你真正想做

问候