我正在尝试通过 crontab 停止和启动我的 Amazon EC2 实例。EC2 Api 工具已成功安装。手动操作有效。
cron(我用命令输入的crontab -e
):
10 * * * * ubuntu /usr/bin/ec2-stop-instances [instanceid] > /tmp/ec2.log
文件/tmp/ec2.log
已创建。当我使用该命令时grep CRON /var/log/syslog
,我看到 cron 已实际运行。但我在文件中没有得到任何输出/tmp/ec2.log
。我已设置了所需的所有 Amazon 变量。
即使我故意创建了一个错误的 cron,如下所示:
10 * * * * ubuntu /usr/bin/ec2-stop-instancwweqes [instanceid] > /tmp/ec2.log
文件中没有输出。不应该有错误吗?我还尝试不定义用户:
10 * * * * /usr/bin/ec2-stop-instances [instanceid] > /tmp/ec2.log
并直接命令:
10 * * * * ubuntu ec2-stop-instances [instanceid] > /tmp/ec2.log
有人能帮帮我吗?如果我能以某种方式调试,我就能找到解决方案。
答案1
'>' 运算符仅将写入标准输出的所有内容重定向(检查:https://stackoverflow.com/questions/876239/bash-redirect-and-append-both-stdout-and-stderr)。Stderr 是一个单独的输出流,这就是为什么您的错误 cron 不起作用的原因,因为它会写入 stderr(典型的 shell 同时显示 stdout 和 stderr)。要将 stderr 和 stdout 都附加到文件,请使用 '&>' 而不是 '>'。
现在来看看你的问题:似乎 Ec2-stop-instances 也没有写入 stdout。使用
10 * * * * ubuntu /usr/bin/ec2-stop-instances [instanceid] &> /tmp/ec2.log
应该可以解决你的问题。
另一种写方式是,通过将 2>&1 附加到构造中来将 stderr(通常是流 1)重定向到 stdout(通常是流 1)的位置:
10 * * * * ubuntu /usr/bin/ec2-stop-instances [instanceid] > /tmp/ec2.log 2&>1