【问题标题】:Cron job execute backup.bashcron作业执行backup.bash
【发布时间】:2010-06-08 08:59:53
【问题描述】:

我希望让 cron 执行 delete_snapshot.bash,但是当我尝试如下创建 cron 时:
*/1 * * * * /var/www/mango_gis/delete_snapshot.bash >/dev/空
它根本没有执行我的脚本,因为当我没有看到它删除亚马逊云中的快照时,我的脚本已经用 bash 进行了测试,它工作正常。

这是我的脚本如下:

#!/bin/bash

get()
{
    local pos=$1
    shift
    eval 'echo ${'$pos'}';
}

length(){ echo $#; }

find_snapshots()
{
    echo $(ec2-describe-snapshots | xargs -n1 basename);
}

snapshots=$(find_snapshots)
len=$(length $snapshots)
row_count=$(($len/6))

if(($row_count > 6)); then
    delete_count=$(($row_count-6))
    for (( i=1; i<=$delete_count; i++ )); do
            ec2-delete-snapshot $(echo $(get $((2+$((6*$(($i-1)))))) $snapshots)) > /dev/null
    done
fi


在上面,我发现问题是我调用了 EC2 命令的一个命令。
我已经测试创建一个 cron 作业来调用此命令是 ec2-describe-snapshots,
但它不起作用。

请指教...

泄密

【问题讨论】:

  • 你怎么知道它“根本没有执行 [the] 脚本?”您两次丢弃标准输出 - 一次在您的 crontab 中,一次在脚本本身中 - 可能脚本 正在执行 但其他一些错误被丢弃或遗漏。你的crond 日志说什么? crond 错误在哪里?是否会运行另一个微不足道的 cronjob(例如,*/1 * * * * logger -p daemon.err -- "I am a cronjob")?
  • 我知道它没有执行脚本,因为我没有从亚马逊云计算中删除我要删除的快照,所以它没有工作。有什么办法可以查看 cron 日志?
  • 您可以在 syslog.conf 中使用“cron”定义日志文件

标签: cron crontab


【解决方案1】:

你应该添加你想用来处理这个文件的程序;类似:

*/1 * * * * /bin/bash  /var/www/mango_gis/delete_snapshot.bash > /dev/null

使用完整路径很重要,因为您没有在 cron 启动进程时加载环境变量

【讨论】:

  • 我已经把它改成了这样 */1 * * * * /usr/bin/bash /var/www/mango_gis/delete_snapshot.bash >/dev/null 但它没有用。
  • 您可以在命令行中使用“which bash”来找出您的 bash 程序的位置。然后将此绝对路径放入您的 cron 作业中。 (程序的位置因系统而异,例如我在 /bin/bash 下获得了 bash 程序(从您的编辑看来,您的 bash 绝对路径是相同的))
  • 请将您的命令(通配符之后的所有内容)复制/粘贴到您的命令行并告诉我们会发生什么(它是否正常工作?)
  • 我复制 /bin/bash /var/www/mango_gis/delete_snapshot.bash > /dev/null 并将其传递给我的命令,它工作正常。
  • 在这种情况下,您的程序很好 - 使用 cronlog 检查 cron。是否有任何其他 cronjob 被执行?例如,您可以在那里放置一个非常简单的
【解决方案2】:

感谢您迄今为止的帮助。 现在我可以抓住它了。

问题是 cron 没有加载 env 变量,所以我们只需要在 cron 执行时指定我们使用的 env 变量。 这是我对 ec2 命令的测试代码,如下所示:

导出 EC2_PRIVATE_KEY=/root/keys/pk-Q4NR5FGDTSWWK65EDSIDCBTEQWJ6G24V.pem 导出 EC2_CERT=/root/keys/cert-Q4NR5FGDTSWWK65EDSIDCBTEQWJ6G24V.pem 导出 JAVA_HOME=/usr/lib/jvm/java-6-sun/ 导出 EC2_HOME_BIN=/usr/bin

echo "启动 ec2-describe-snapshots" >> /var/log/ec2-delete-snapshot.log $EC2_HOME_BIN/ec2-describe-snapshots >> /var/log/ec2-delete-snapshot.log echo "结束它" >> /var/log/ec2-delete-snapshot.log

【讨论】:

  • 这正是我昨天在其他 cmets 中对我的回答所说的(您需要推动“显示 x 更多 cmets”才能看到它们)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2012-03-04
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多