如何在cron中调用脚本时传递参数?

时间:2017-10-04 16:56:57

标签: bash cron

我想用一些参数作为cron作业来执行脚本。我已使用crontab -e使用以下内容

配置了crontab
*/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"

2 个答案:

答案 0 :(得分:1)

第一个crontab条目看起来正确。由于没有#! /bin/bash行,您可能需要在调用前放置bash,例如。

*/2 * * * * /bin/bash /root/todo-api/workspace/docker.sh c4e842c79337

根据docker inspect

  

用法

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 重定向到文件以实际查看它的工作情况。