代码之家  ›  专栏  ›  技术社区  ›  Tanj

bash脚本从shell运行,但不是从cron作业运行

  •  8
  • Tanj  · 技术社区  · 17 年前

    cron安装是vixie cron

    /etc/cron.daily/rmspam.cron

    #!/bin/bash
    /usr/bin/rm /home/user/Maildir/.SPAM/cur/*;
    

    我有一个简单的bash脚本,我想添加到cron作业(也包括以前的垃圾邮件学习命令),但这部分总是失败,因为“找不到文件或目录”,从我看来,当作为cron作业运行时,metachar没有被正确插入。如果我从命令行执行脚本,它会正常工作。

    我想知道为什么这个不起作用,当然还有一个有效的解决方案:)

    谢谢

    编辑第1页 当我得到这个问题的流行徽章时,我又回到了这个问题上。我第一次这么做,

    #!/bin/bash
    find  /home/user/Maildir/.SPAM/cur/ -t file | xargs rm
    

    最近正在阅读xargs的手册,改成了这个。

    #!/bin/bash
    find  /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm
    

    short xargs选项是-r

    5 回复  |  直到 15 年前
        1
  •  14
  •   janm    17 年前

    如果目录中没有文件,则不会展开通配符,并将直接传递给命令。没有名为“*”的文件,命令将失败,并显示“找不到文件或目录”。请尝试以下操作:

    if [ -f /home/user/Maildir/.SPAM/cur/* ]; then
        rm /home/user/Maildir/.SPAM/cur/*
    fi
    

    或者只需使用“-f”标记来rm。这个命令的另一个问题是,当命令行的最大长度内有太多垃圾邮件时会发生什么。这样的情况总体上可能会更好:

    find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' +
    

    如果您有旧的发现,一次只能执行一个文件:

    find /home/user/Maildir/.SPAM/cur -type f | xargs rm
    

    它处理的文件太多,而且没有文件。感谢Charles Duffy在find中指出了-exec的+选项。

        2
  •  0
  •   Mark Biek    17 年前

    是否指定cronjob中脚本的完整路径?

    00 3 * * * /home/me/myscript.sh
    

    而不是

    00 3 * * * myscript.sh
    

    在另一张纸条上,它是 /bin/rm 在我可以访问的所有Linux设备上。你仔细检查过它是真的吗 /UR/BI/RM 在你的机器上?

        3
  •  0
  •   Ken    17 年前

    尝试添加

    MAILTO=your@email.address
    

    在cron文件的顶部,您应该收到任何输入/错误的邮件。

    还可以考虑将该命令添加为cronjob

    0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
    
        4
  •  0
  •   bcelary    17 年前

    尝试使用force选项,然后忘记向rm命令添加路径。我认为不需要它…

    rm -f
    

    这将确保即使目录中没有文件,rm命令也不会失败。如果这是shell脚本的一部分,*应该可以工作。在我看来,你可能有一个空目录…

    我知道脚本的其余部分正在执行,对吗?

        5
  •  0
  •   ulidtko    15 年前

    rm 位于 /usr/bin/ 在你的系统上?我一直认为 RM 应该居住在 /bin/ .

    推荐文章