Eu tenho um script sh. Como rodar usando o crontab?

1

Eu tenho o seguinte arquivo execute-backup-from-container.sh . O conteúdo deste arquivo é:

#!/bin/bash
FILE=minime.sql.'date +"%Y%m%d".gz'
CONTAINER='mysql_01'
SCRIPT_ON_CONTAINER='/container-mysql-dump.sh'

${OUTPUT}=$(docker exec ${CONTAINER} /$SCRIPT_ON_CONTAINER)

echo "=============="
echo "$CONTAINER:/$FILE"
echo "=============="
docker cp "$CONTAINER:/$FILE" backup-data/

Quando eu executo crontab -e , estou colocando o seguinte:
0 5 * * 1 /home/me/projects/execute-backup-from-container.sh Isso significa que o execute-backup-from-container.sh deve ser executado todos os dias às 5:00 da manhã.
O problema é que o script não é executado de forma alguma. Então, qual é o problema? Por que não é executado?

    
por Cristian 24.03.2018 / 00:46

3 respostas

4

Os campos cron correspondentes à sua entrada significam:

minute:       0 
hour:         5 
day of month: * 
month:        * 
day of week:  1 
command:      /home/me/projects/execute-backup-from-container.sh

que traduzem em inglês para: segundas às 5h (qualquer dia do mês, qualquer mês).

Se você deseja que ele seja executado:

every day at 5:00 am

você quer que o quinto campo seja um * :

0 5 * * * /home/me/projects/execute-backup-from-container.sh
    
por 24.03.2018 / 01:49
1

Você verificou se o arquivo está definido como executável? Aqui está um exemplo de como marcar um script como executável:

$ ls -l test.sh
-rw-r--r-- 1 ahill ahill 0 Mar 23 19:30 test.sh
$ chmod +x test.sh
$ ls -l test.sh
-rwxr-xr-x 1 ahill ahill 0 Mar 23 19:30 test.sh

A próxima coisa a verificar é o ambiente. trabalhos agendados não herdam nenhum ambiente por padrão. A "correção" é discutida aqui:
Como posso executar um comando cron com variáveis ambientais existentes?

Uma das razões pelas quais o ambiente é um grande problema é que o cron pode nem encontrar o bash! veja: link

Se você ainda não consegue descobrir, eu faria um teste: Altere sua tarefa do cron de:

0 5 * * * /home/me/projects/execute-backup-from-container.sh

para:

0 5 * * * /home/me/projects/execute-backup-from-container.sh >> ~/script_errors.log 2>&1 

O que acontecerá: na próxima vez em que o cron iniciar a tarefa, as mensagens de erro produzidas serão despejadas no arquivo de texto script_errors.log. (mude o caminho para o arquivo script_errors.log para o que parecer apropriado, mas certifique-se de que o caminho exista, embora o arquivo não precise.)

Eu também notei algo no OP que pode ser o verdadeiro problema: a palavra "contêiner". Se o script estiver dentro de um contêiner do Docker, essa provavelmente é a solução: link

    
por 24.03.2018 / 01:38
0

Depois de ter em conta todas as respostas, o último problema foi na última linha:

docker cp "$CONTAINER:/$FILE" backup-data/  

A última linha deveria ter sido

docker cp "$CONTAINER:/$FILE" docker-projects/mysql/backup-data/  

Obrigado a todos pelo seu apoio.

    
por 30.03.2018 / 15:47