จะส่งพารามิเตอร์ขณะเรียกใช้สคริปต์ใน cron ได้อย่างไร

ฉันต้องการรันสคริปต์ด้วยพารามิเตอร์บางตัวเป็นงาน cron ฉันได้กำหนดค่า crontab โดยใช้ crontab -e กับเนื้อหาต่อไปนี้

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

แต่มันไม่ทำงาน เมื่อผมใช้

*/2 * * * * /root/todo-api/workspace/docker.sh

มันได้ผล จะส่งพารามิเตอร์ขณะเรียกใช้สคริปต์ใน cron ได้อย่างไร นี่คือสคริปต์ docker.sh ของฉันและใช้งานได้หากฉันเรียกใช้งานโดยตรงจากเชลล์

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"

person codec    schedule 04.10.2017    source แหล่งที่มา
comment
คุณสร้างงานนี้ได้อย่างไร?   -  person Cyrus    schedule 04.10.2017
comment
ทำไมคุณถึงมี " นำหน้าในกรณีที่ 2?   -  person Inian    schedule 04.10.2017
comment
ทำไมคุณคิดว่ามันไม่ทำงาน?   -  person Olaf Dietsche    schedule 04.10.2017
comment
แต่มันใช้งานไม่ได้ - โปรดอธิบายข้อความนี้อย่างละเอียด   -  person Kaushik Nayak    schedule 04.10.2017
comment
เนื่องจากคำอธิบายปัญหาที่จำกัดอยู่ที่นี่ จึงง่ายกว่ามากที่จะสรุปว่ามีปัญหาภายในสคริปต์ .../docker.sh ของคุณ โปรดอัปเดต Q ของคุณด้วยจำนวนโค้ดขั้นต่ำที่ผู้อื่นสามารถสร้างปัญหาของคุณได้ ขณะนี้มันเป็นเรื่องลึกลับ ;-) ขอให้โชคดี.   -  person shellter    schedule 04.10.2017


คำตอบ (2)


รายการ 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 คาดว่าจะมีชื่อหรือรหัสบางส่วน

หากต้องการแก้ไขข้อบกพร่องเพิ่มเติม ให้ทำตามคำถามนี้ จะแก้ไขข้อบกพร่องสคริปต์ bash ได้อย่างไร และเก็บเอาต์พุตจาก stderr เช่น ลบ 2>/dev/null

person Olaf Dietsche    schedule 10.10.2017

คุณส่งพารามิเตอร์เช่นเดียวกับที่คุณทำในเชลล์

วิธีทดสอบที่ดีคือการสร้าง /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 ไปยังไฟล์เพื่อดูว่ามันใช้งานได้จริง

person RicarHincapie    schedule 27.05.2021