Запуск кронштейна з різними параметрами щодня


12

Я програміст і не знаю багато про крони, але хочу знати, чи це можливо.

Скажімо, у мене є масив [option1, option2, option3]і скрипт, який я запускаю в NodeJS script.js. Я хочу запускати цей сценарій щодня о 1 годині ранку. cronКоманда це буде:

0 1 * * * node ~/script.js

Ну а тепер хитра частина, я хочу щодня обертати параметри, тому, наприклад, у понеділок я хочу бігти node ~/script.js option1, на наступний день node ~/script.js option2тощо. Також я хочу мати можливість додавати / видаляти параметри, коли потрібно, але обертання повинно залишатися недоторканим.

Чи можливо це в будь-який спосіб? Я знаю, що я міг би це зробити і всередині вузла, але краще зробити це за межами сценарію і залишити сценарій таким, яким він є.


2
Я б порекомендував прописати це проти того, щоб спробувати зробити так, щоб крон робив це сам.
earthmeLon

Відповіді:


15

Також я хочу мати можливість додавати / видаляти параметри, коли потрібно, але обертання повинно залишатися недоторканим.

Це хитро. Що означає, що обертання залишається недоторканим після зміни списку опцій? Зрештою, ви могли повністю відновити список, знищивши будь-яку підказку щодо того, де ви були.

Можливо, ви можете створити каталог із файлами, які представляють ваші параметри (через ім'я файлу чи вміст). Тоді, коли виконується завдання cron, ви перераховуєте цей каталог, сортуючи файли за останнім часом модифікації. Ви берете найстаріший запис touchцього файлу, щоб змінити його час модифікації на поточний час, а потім використовуєте його для запуску сценарію.

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

Якщо ви хочете, ви можете написати це також в одному рядку для cron, хоча це буде важче читати.

Додавання параметрів означає додавання нових файлів у каталог параметрів. Видалення параметрів означає видалення файлів. У будь-якій точці найстаріший файл - це той, який буде запущений далі, тому нові параметри будуть додані в самому кінці циклу, як ніби щойно запущені. Якщо ви хочете повторно замовити параметри, ви можете торкнутися їх у будь-якому бажаному порядку.


Абсолютно +1 за те, як ви керуєте послідовністю варіантів у "редагуванні списку".
Хаген фон Ейтцен

Дякую за відповідь, мені це подобається і буду використовувати його. Точний порядок обертання не так важливий, коли я додаю нові до списку. Єдине, що важливо, це те, що всі вони проходять один раз на тиждень, а не два в один і той же день.
Сайф Бечан

2
$(ls -rt | head -n1)Звичайно, буде перерва на імена файлів, які містять нові рядки, але для цього ви, ймовірно, можете піти просто "не робити цього".
cjm

20

Скажімо, ви хочете різний варіант для кожного дня тижня. Ти можеш:

  1. Для цього є окрема робота з cron:

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

    тощо ...

  2. Є bashзабезпечити бажані варіанти для Вас:

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

    (Я не запускав останнє, тож може знадобитися певний перегляд, але це загальна ідея.)


2
Дякую за відповіді, але я думаю, що це стане безладним. Мені дійсно потрібно десь визначити масив, інакше він не буде працювати. Я не можу працювати з echo option1тощо, тому що мої варіанти можуть відрізнятися від тижня до тижня. Я просто це роблю в моєму додатку "Вузол" і відслідковую, який з них я перебіг останнім у своєму db.
Сайф Бечан

13

Ні, я не можу придумати жодного чистого способу зробити це. Просто напишіть простий скрипт для обгортки оболонки, який перевіряє дату та запускає додаток для вузла з необхідними параметрами щодня.


Клавіша +1 - "чистий спосіб".
Паоло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.