Como faço para a execução em cadeia de scripts? [duplicado]

0

Eu quero automatizar a execução de um script Python. E eu acho que já sei como fazer isso com uma entrada no cron.

O problema é que eu preciso que esse script seja executado novamente apenas se um anterior tiver terminado.

O script Python lê um arquivo .csv (somente o primeiro registro) e fornece como parâmetros para o script em diante. Então esse registro é removido daquela tabela (que é essencialmente como uma lista de execuções que precisam ser feitas) e é movido para outra tabela para tarefas concluídas junto com o resultado do script.

Portanto, como os registros estão sendo excluídos em cada execução, eu preciso de uma iteração do script a ser iniciada apenas se a anterior terminar.

Como / Posso fazer isso no Ubuntu 16.04 LTS?

EDITAR:

Eu tentei agendar o script python dessa maneira e instalei o run-one assim:

sudo apt-get update
sudo apt-get install run-one

# The below code is in crontab
* * * * * run-one python '/home/phdmonster/Downloads/nn course/my_code.py'

Ae isso não funciona. Nenhuma tarefa é executada.

Editar por Sergiy Kolodyazhnyy: Problema resolvido em comentários, também discutido em chat room vinculado; problema foi com extra * , trabalhos duplicados vinculados conforme os comentários do OP

    
por Emil Filipov 27.01.2018 / 09:03

2 respostas

0

Como você está usando o cron, eu suponho que você comece seu script em intervalos regulares. Cada execução modifica um arquivo de resultado.

Assim, o script pode fazer o seguinte no início:

  • verifique se o arquivo de resultado existe (isto é, a primeira execução)
  • se isso não ocorrer, crie-o
  • calcular a hora de início da execução anterior
  • verifique se a hora da modificação do arquivo de resultado é mais recente que esta hora de início
  • se não é isso significa que a última corrida ainda não terminou, portanto o script sai sem fazer nada

Os dois primeiros itens estão lá para que o processo seja executado. Se você não incluí-los, a primeira execução não fará nada, já que está aguardando a conclusão de um predecessor não existente.

    
por muclux 27.01.2018 / 09:28
0

Se você está iniciando seu script do cron e quer verificar se o anterior foi terminado antes de iniciar o próximo Você pode fazer seu script criar em algum lugar pré-definido, um link simbólico para sua representação em / proc (/ proc / [ PID]) e, em seguida, apague-o no final.

Você teria que verificar se o link está quebrado antes de executá-lo novamente, ou verificar sua linha de comando /proc/[PID]/cmdline se ele não estiver quebrado, caso um travamento tenha impedido que o link seja apagado e outro processo teria aparecido com o mesmo PID (se o processo ainda estiver em execução, a linha de comando terá o conteúdo esperado. Se for mais alguma coisa, significa que é apenas outro processo com o mesmo PID).

Se você quiser apenas encadear uma lista de scripts, mas apenas se o script anterior não apresentar erros, provavelmente não precisará do cron.

você pode usar a sintaxe && para encadear scripts diferentes: o shell testará o código de retorno de um script e iniciará o próximo somente se não houver erro:

script1 && script2

Se você quiser que um script seja executado repetidamente, enquanto não houver erro, você pode usar a sintaxe while para executá-lo repetidamente até que ele retorne um código de retorno diferente de zero.

while script; do true; done # here the true command, is just a "no operation"
    
por Camion 27.01.2018 / 10:59