Prowadzenie cronjob z różnymi parametrami każdego dnia

12

Jestem programistą i nie wiem dużo o cronach, ale chcę wiedzieć, czy to możliwe.

Powiedzmy, że mam tablicę [option1, option2, option3]i skrypt, który uruchomiłem w NodeJS script.js. Chcę uruchamiać ten skrypt codziennie o 1 w nocy. cronPolecenie to może być:

0 1 * * * node ~/script.js

Cóż, teraz trudna część, chcę zmieniać opcje każdego dnia, więc na przykład w poniedziałek chcę biegać node ~/script.js option1, następnego dnia node ~/script.js option2i tak dalej. Chcę też móc dodawać / usuwać opcje w razie potrzeby, ale rotacja powinna pozostać nienaruszona.

Czy jest to w jakikolwiek sposób możliwe? Wiem, że mógłbym to zrobić również w węźle, ale wolałbym to zrobić spoza skryptu i pozostawić skrypt bez zmian.

Saif Bechan
źródło
2
Poleciłbym skryptowanie tego vs próbę zmuszenia crona do zrobienia tego samego.
earthmeLon

Odpowiedzi:

15

Chcę też móc dodawać / usuwać opcje w razie potrzeby, ale rotacja powinna pozostać nienaruszona.

To trudne. Co to znaczy, że obrót pozostanie nienaruszony po modyfikacji listy opcji? W końcu możesz całkowicie odbudować listę, niszcząc wszelkie wskazówki, gdzie jesteś.

To, co prawdopodobnie możesz zrobić, to skonfigurować katalog z plikami, które reprezentują twoje opcje (albo poprzez ich nazwę pliku, albo ich zawartość). Następnie za każdym razem, gdy wykonuje się zadanie cron, należy wyświetlić ten katalog, sortując pliki według czasu ostatniej modyfikacji. Weź najstarszy wpis, touchten plik, aby zmienić jego czas modyfikacji na bieżący czas, a następnie użyj go do uruchomienia skryptu.

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

Jeśli chcesz, możesz napisać to również w jednym wierszu dla crona, choć będzie trudniej go odczytać.

Dodanie opcji oznacza dodanie nowych plików do katalogu opcji. Usunięcie opcji oznacza usunięcie plików. W dowolnym momencie najstarszy plik zostanie uruchomiony jako następny, więc nowe opcje zostaną dodane na samym końcu cyklu, tak jakby właśnie został uruchomiony. Jeśli chcesz ponownie zamówić opcje, możesz je dotknąć w dowolnej kolejności.

MvG
źródło
Absolutnie +1 za sposób zarządzania sekwencją opcji w „edycjach list”.
Hagen von Eitzen
Dzięki za odpowiedź, podoba mi się i wykorzystam ją. Dokładna kolejność obrotu nie jest tak ważna, gdy dodam nowe do listy. Liczy się tylko to, że wszyscy biegną 1-2 raz w tygodniu co tydzień, a nie dwa tego samego dnia.
Saif Bechan
2
$(ls -rt | head -n1)oczywiście zepsuje się na nazwach plików zawierających nowe wiersze, ale w tym celu prawdopodobnie można uniknąć po prostu „nie rób tego”.
cjm
20

Powiedzmy, że chcesz mieć inną opcję na każdy dzień tygodnia. Możesz:

  1. Posiadaj osobne zadanie cron dla tych:

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

    itp...

  2. Podaj bashżądane opcje:

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

    (Nie uruchomiłem tego drugiego, więc może potrzebować trochę ulepszeń - ale to jest ogólny pomysł).

Konrad Gajewski
źródło
2
Dzięki za odpowiedzi, ale myślę, że będzie bałagan. Naprawdę muszę gdzieś zdefiniować tablicę, bo inaczej to nie zadziała. Nie mogę pracować z echo option1itp., Ponieważ moje opcje mogą się zmieniać z tygodnia na tydzień. Po prostu zrób to w mojej aplikacji Node i śledź, który z nich uruchomiłem jako ostatni w db.
Saif Bechan
13

Nie, nie mogę wymyślić żadnego czystego sposobu na zrobienie tego. Wystarczy napisać prosty skrypt otoki powłoki, który sprawdza datę i uruchamia aplikację węzła z wymaganymi opcjami każdego dnia.

EEAA
źródło
+1 klucz to „nie ma czystego sposobu”.
Paolo,