Menjalankan cronjob dengan parameter berbeda setiap hari

12

Saya seorang programmer, dan tidak tahu banyak tentang crons, tapi saya ingin tahu apakah ini mungkin.

Katakanlah saya memiliki array [option1, option2, option3]dan skrip yang saya jalankan di NodeJS disebut script.js. Saya ingin menjalankan skrip ini setiap hari jam 1 pagi. The cronperintah ini akan menjadi:

0 1 * * * node ~/script.js

Nah sekarang bagian yang sulit, saya ingin memutar opsi setiap hari, jadi misalnya Senin saya ingin menjalankan node ~/script.js option1, hari berikutnya node ~/script.js option2dan seterusnya. Juga, saya ingin dapat menambah / menghapus opsi saat dibutuhkan, tetapi rotasi harus tetap utuh.

Apakah ini mungkin? Saya tahu saya bisa melakukan ini di dalam simpul juga, tetapi saya lebih suka melakukan ini dari luar skrip, dan biarkan skrip seperti apa adanya.

Saif Bechan
sumber
2
Saya akan merekomendasikan skrip ini vs mencoba membuat cron melakukannya sendiri.
earthmeLon

Jawaban:

15

Juga, saya ingin dapat menambah / menghapus opsi saat dibutuhkan, tetapi rotasi harus tetap utuh.

Itu rumit. Apa artinya rotasi tetap utuh setelah modifikasi daftar opsi? Lagi pula, Anda bisa membangun kembali daftar, menghancurkan petunjuk apa pun tentang di mana Anda berada.

Apa yang mungkin bisa Anda lakukan adalah mengatur direktori dengan file yang mewakili opsi Anda (baik melalui nama file mereka, atau konten mereka). Lalu kapan pun tugas cron dijalankan, Anda akan mendaftar direktori itu, mengurutkan file berdasarkan waktu modifikasi terakhir. Anda mengambil entri terlama, touchfile itu untuk mengubah waktu modifikasinya menjadi waktu saat ini, kemudian menggunakannya untuk menjalankan skrip.

#!/bin/bash
cd ~/script-options
next=$(ls -rt | head -n1)
touch -- "${next}"
node ~/script.js ${next} or $(<"${next}")

Jika Anda mau, Anda dapat menulis ini dalam satu baris untuk cron juga, meskipun akan menjadi lebih sulit untuk dibaca.

Menambahkan opsi berarti menambahkan file baru ke direktori opsi. Menghapus opsi berarti menghapus file. Pada titik mana pun, file terlama adalah yang akan dijalankan berikutnya, sehingga opsi baru akan ditambahkan di akhir siklus, seolah-olah baru saja dijalankan. Jika Anda ingin memesan ulang opsi, Anda dapat menyentuhnya dalam urutan apa pun yang Anda inginkan.

MvG
sumber
Benar-benar memberi +1 untuk cara Anda mengelola sekuensial opsi di "edit daftar".
Hagen von Eitzen
Terima kasih atas jawabannya, saya suka dan akan menggunakannya. Urutan rotasi yang tepat tidak begitu penting ketika saya menambahkan yang baru ke dalam daftar. Satu-satunya hal yang penting adalah mereka semua berlari 1-2 setiap minggu setiap minggu, dan bukan dua lari pada hari yang sama.
Saif Bechan
2
$(ls -rt | head -n1)tentu saja akan merusak nama file yang menyertakan baris baru, tetapi untuk tujuan ini Anda mungkin bisa lolos hanya dengan "jangan lakukan itu".
cjm
20

Katakanlah Anda menginginkan opsi yang berbeda untuk setiap hari dalam seminggu. Kamu bisa:

  1. Punya tugas cron terpisah untuk ini:

    0 1 * * 0 node ~/script.js option1
    0 1 * * 1 node ~/script.js option2
    0 1 * * 2 node ~/script.js option3
    

    dll ...

  2. Berikan bashopsi yang diinginkan untuk Anda:

    0 1 * * * node ~/script.js case `date +%u` in 0 ) echo option1 ;; 1 ) echo option2 ;; 2 ) echo option3 ;;  esac
    

    (Saya tidak menjalankan yang terakhir, jadi mungkin perlu sedikit penyesuaian - tapi itu ide umum.)

Konrad Gajewski
sumber
2
Terima kasih atas jawabannya, tapi saya pikir itu akan berantakan. Saya benar-benar perlu mendefinisikan array di suatu tempat, kalau tidak array tidak akan berfungsi. Saya tidak dapat bekerja dengan echo option1dll, karena opsi saya mungkin bervariasi dari minggu ke minggu. Sakit lakukan saja ini di aplikasi Node saya, dan pantau yang mana saya berlari terakhir di db saya.
Saif Bechan
13

Tidak, saya tidak bisa memikirkan cara yang bersih untuk melakukan ini. Tulis saja skrip pembungkus shell sederhana yang memeriksa tanggal dan memulai aplikasi simpul Anda dengan opsi yang diperlukan setiap hari.

EEAA
sumber
+1 kuncinya adalah 'tidak bersih'.
Paolo