Executando um cronjob com parâmetros diferentes a cada dia

12

Sou programador e não sei muito sobre crons, mas quero saber se isso é possível.

Digamos que eu tenho uma matriz [option1, option2, option3]e um script que eu executo no NodeJS chamado script.js. Eu quero executar esse script todos os dias às 01:00. O croncomando disso seria:

0 1 * * * node ~/script.js

Bem, agora a parte complicada, eu quero alternar as opções todos os dias, por exemplo, segunda-feira, eu quero correr node ~/script.js option1, no dia seguinte node ~/script.js option2e assim por diante. Além disso, quero poder adicionar / remover opções quando necessário, mas a rotação deve permanecer intacta.

Isso é possível de alguma forma? Sei que também poderia fazer isso dentro do nó, mas prefiro fazê-lo de fora do script e deixá-lo como está.

Saif Bechan
fonte
2
Eu recomendaria o script deste vs tentando obter cron fazê-lo por si só.
precisa saber é o seguinte

Respostas:

15

Além disso, quero poder adicionar / remover opções quando necessário, mas a rotação deve permanecer intacta.

Isso é complicado. O que significa que a rotação permanece intacta após a modificação da lista de opções? Afinal, você poderia estar reconstruindo completamente a lista, destruindo qualquer pista sobre onde estava.

O que você provavelmente poderia fazer é configurar um diretório com arquivos que representem suas opções (seja pelo nome do arquivo ou pelo conteúdo). Então, sempre que o trabalho cron for executado, você listará esse diretório, classificando os arquivos pela última vez em que foi feita a modificação. Você pega a entrada mais antiga, touchesse arquivo, para alterar seu horário de modificação para o horário atual e, em seguida, usa-o para executar o script.

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

Se quiser, você pode escrever isso em uma única linha para o cron, embora seja mais difícil de ler.

Adicionar opções significa adicionar novos arquivos ao diretório de opções. Remover opções significa excluir arquivos. A qualquer momento, o arquivo mais antigo será o próximo a ser executado, portanto, novas opções serão adicionadas no final do ciclo, como se ele tivesse acabado de ser executado. Se desejar reordenar as opções, toque-as na ordem que desejar.

MvG
fonte
Absolutamente +1 na maneira como você gerencia a seqüencialidade das opções nas "edições da lista".
Hagen von Eitzen
Obrigado pela resposta, eu gosto e vou usá-lo. A ordem exata da rotação não é tão importante quando adiciono novas à lista. A única coisa que importa é que todos façam uma corrida 1-2 a cada semana, e não duas no mesmo dia.
Saif Bechan 28/08
2
$(ls -rt | head -n1)obviamente, você quebrará nomes de arquivos que incluem novas linhas, mas para esse fim, você provavelmente pode se safar apenas "não faça isso".
Cjm 28/08/2015
20

Digamos que você queira uma opção diferente para cada dia da semana. Você pode:

  1. Tenha um trabalho cron separado para estes:

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

    etc ...

  2. Tem bashfornecer as opções desejadas para você:

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

    (Eu não executei o último, por isso pode precisar de alguns ajustes - mas essa é a ideia geral.)

Konrad Gajewski
fonte
2
Obrigado pelas respostas, mas acho que ficará confuso. Eu realmente preciso definir uma matriz em algum lugar, caso contrário não funcionará. Não posso trabalhar com echo option1etc, porque minhas opções podem variar de semana para semana. Vou fazer isso no meu aplicativo Node e acompanhar qual deles eu executei por último no meu banco de dados.
Saif Bechan
13

Não, não consigo pensar em nenhuma maneira limpa de fazer isso. Basta escrever um script simples de invólucro de shell que verifique a data e inicie o aplicativo do nó com as opções necessárias todos os dias.

EEAA
fonte
+1 a chave é 'não há maneira limpa'.
Paolo