Como executar o comando bash com argumentos no horário agendado

0

Eu tenho um arquivo bash que executa um processo em uma série de arquivos recém-baixados, todos os dias, o tempo total de execução de todo o processamento é de várias horas.

Eu quero executar um comando bash em particular 24 horas após o processo ter sido executado em um determinado arquivo.

Eu tentei usar at para isso, mas acho que você não pode usar para executar um comando bash, por exemplo:

at now +24 hours gsutil rm gs://$google_cloud_storage_location/$processed_file

E eu também não consigo executar um script bash com argumentos.

at now +24 hours -f example_script.bash $google_cloud_storage_location/$processed_file

Qual é a maneira correta de programar essas tarefas? Eu só preciso de uma ferramenta completamente diferente ou estou perdendo uma maneira com at ?

Exemplo de script bash:

for file in list_of_files; do
    #do some processing
    ....
    #then delete the file
    at now +24 hours gsutil rm gs://file
done
    
por Dominic Woodman 20.12.2016 / 01:41

2 respostas

2

Se você quiser que suas variáveis sejam substituídas no momento de configurar o trabalho, você pode executar um comando bash simples com at simplesmente colocando o comando em at com echo. Para o seu primeiro exemplo, a sintaxe seria

echo "gsutil rm gs://$google_cloud_storage_location/$processed_file" | at now +24 hours

Para o segundo exemplo, a sintaxe poderia ser

echo "/path/to/example_script.bash $google_cloud_storage_location/$processed_file" | at now +24 hours

Se a substituição de variáveis precisar ser executada no momento do trabalho, é um pouco mais complicado. Você precisará criar um script que seja executado quando o trabalho tiver que ser feito, substituindo no momento apropriado. Isso pode ser feito usando um comando exclusivamente (por exemplo, de um script) fazendo

echo -e '#!/bin/bash' > /path/to/script

Então

echo '<your command here>' >> /path/to/script

Em seguida, a sintaxe do comando at é

at now +24 hours -f /path/to/script

É claro que a parte +24 hours deve ser ajustada na duração adequada.

    
por fakedad 20.12.2016 / 02:12
1

Como at lê comandos de stdin ou de um arquivo:

for file in list_of_files; do
    #do some processing
    ....
    #then delete the file
    at now +24 hours <<EOF
gsutil rm gs://"$file"
EOF
done

O uso de heredocs para fornecer os comandos funcionaria, já que as variáveis são expandidas em heredocs, a menos que o marcador heredoc ( EOF , here) seja citado.

    
por muru 20.12.2016 / 02:06