我想用一些参数作为cron作业来执行脚本。我已使用crontab -e
使用以下内容
*/2 * * * * /root/todo-api/workspace/docker.sh c4e842c79337
但它不起作用。我用的时候
*/2 * * * * /root/todo-api/workspace/docker.sh
它奏效了。如何在cron中调用脚本时传递参数?这是我的docker.sh脚本,如果我直接从shell执行它,它就可以工作。
CONTAINER=$1
RUNNING=$(docker inspect --format="{{.State.Running}}" $CONTAINER 2> /dev/null)
if [ $? -eq 1 ]; then
echo "UNKNOWN - $CONTAINER does not exist."
exit 3
fi
if [ "$RUNNING" == "false" ]; then
echo "CRITICAL - $CONTAINER is not running."
curl -H "Content-type: application/json" -X POST -d '{"routing_key": "3ef61cda125048a390d46cdb8d425590","event_action": "trigger","payload": {"summary": "Docker Container '$CONTAINER' down", "source": "'$CONTAINER'", "severity": "critical" }}' "https://events.pagerduty.com/v2/enqueue"
exit 2
fi
echo "OK"
答案 0 :(得分:1)
第一个crontab条目看起来正确。由于没有#! /bin/bash
行,您可能需要在调用前放置bash,例如。
*/2 * * * * /bin/bash /root/todo-api/workspace/docker.sh c4e842c79337
用法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
没有$CONTAINER
的第二次调用必定会失败,因为inspect
需要名称或某个ID。
要进一步调试,请按照此问题How to debug a bash script?并保留stderr的输出,例如删除2>/dev/null
。
答案 1 :(得分:1)
传递参数就像在 Shell 中一样。
测试它的一个好方法是创建一个简单的 /home/script.sh
,例如:
#!/bin/bash
echo "My first input is $1"
echo "And my second input is $2"
等等......
然后像这样每分钟执行一次:
* * * * * /home/script.sh >> /home/cron_output.log
使用此过程可确保您自己的脚本按需要运行。
根据我的经验,>>
之前的所有内容都被假定为脚本的参数。
请记住,cronjob 在其自己的分离外壳上运行,因此您需要将 STDOUT 重定向到文件以实际查看它的工作情况。