Bagaimana cara meneruskan parameter saat menjalankan skrip di cron?

Saya ingin menjalankan skrip dengan beberapa parameter sebagai pekerjaan cron. Saya telah mengkonfigurasi crontab menggunakan crontab -e dengan konten berikut

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

tapi itu tidak berhasil. Ketika saya menggunakan

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

itu berhasil. Bagaimana cara meneruskan parameter saat menjalankan skrip di cron? Ini skrip docker.sh saya dan berfungsi jika saya langsung menjalankannya dari 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"

person codec    schedule 04.10.2017    source sumber
comment
Bagaimana Anda menciptakan pekerjaan ini?   -  person Cyrus    schedule 04.10.2017
comment
Mengapa Anda memiliki " di awal dalam kasus kedua?   -  person Inian    schedule 04.10.2017
comment
Menurut Anda mengapa itu tidak berhasil?   -  person Olaf Dietsche    schedule 04.10.2017
comment
tetapi tidak berhasil - harap uraikan pernyataan ini.   -  person Kaushik Nayak    schedule 04.10.2017
comment
Mengingat deskripsi masalah yang terbatas di sini, lebih mudah untuk berasumsi bahwa ada masalah di dalam skrip .../docker.sh Anda. Harap perbarui Q Anda dengan jumlah kode minimum yang dapat digunakan orang lain untuk mereproduksi masalah Anda. Saat ini, itu adalah sebuah misteri ;-) . Semoga beruntung.   -  person shellter    schedule 04.10.2017


Jawaban (2)


Entri crontab pertama terlihat benar. Karena tidak ada baris #! /bin/bash, Anda mungkin perlu meletakkan bash di depan pemanggilan, mis.

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

Menurut pemeriksaan buruh pelabuhan

Penggunaan

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

pemanggilan kedua tanpa $CONTAINER harus gagal, karena inspect mengharapkan nama atau beberapa id.

Untuk men-debug ini lebih lanjut, ikuti pertanyaan ini Bagaimana cara men-debug skrip bash? dan menyimpan output dari stderr, misalnya. hapus 2>/dev/null.

person Olaf Dietsche    schedule 10.10.2017

Anda meneruskan parameter seperti yang Anda lakukan di Shell.

Cara yang baik untuk mengujinya adalah dengan membuat /home/script.sh sederhana seperti:

#!/bin/bash

echo "My first input is $1"
echo "And my second input is $2"

Dan seterusnya ...

Kemudian jalankan seperti itu dijalankan setiap menit:

* * * * * /home/script.sh >> /home/cron_output.log

Gunakan prosedur ini untuk memastikan skrip Anda berjalan sesuai keinginan. Menurut pengalaman saya, segala sesuatu sebelum >> diasumsikan sebagai parameter untuk skrip.

Ingatlah bahwa cronjob berjalan pada shellnya sendiri yang terpisah, jadi Anda perlu mengarahkan ulang STDOUT ke suatu file agar benar-benar melihatnya berfungsi.

person RicarHincapie    schedule 27.05.2021