O CronTab não está funcionando no Ubuntu para o trabalho de compactação de imagem: “/ bin / bash ^ M: intérprete incorreto: não existe esse arquivo ou diretório” [duplicado]

0

Estou tentando configurar um cronjob para executar o script a seguir. A função do script é encontrar e compactar arquivos png e jpg em um diretório do WordPress.

    #!/bin/bash
echo 'date' >> /root/optipng.log
find /home/ghost/wp-content/uploads -mtime -2 -iname '*.png' -print0 | \
 xargs -0 optipng -o7 -log /root/optipng.log -preserve
echo 'date' >> /root/jpegoptim.log
find /home/ghost/wp-content/uploads  -mtime -2 -iname '*.jpg' -print0 | \
 xargs -0 jpegoptim --max=90 --preserve --totals >> /root/jpegoptim.log

Então criei um arquivo " optimize.sh " no diretório / usr / local e correu " crontab -e " e adicionou o seguinte comando:

00 10 * * *  root  /usr/local/optimize.sh

Isso deve executar a otimização de imagem todos os dias às 10:00 horas, mas não está funcionando nesse caso. Eu até tentei criar um arquivo de log modificando o comando acima como:

00 10 * * *  root  /usr/local/optimize.sh &>/var/log/cron.log

O arquivo de log está vazio e a tarefa do cron não está em execução. Eu tentei os outros métodos mencionados no Stack Overflow, nenhum deles parecia funcionar. Eu também estou listando alguns outros tutoriais que pedi ajuda:

link

link

Alguém por favor pode apontar onde está o erro? :)

PS- Eu dei 700 permissões para o arquivo /usr/local/optimize.sh e tentei rodar o arquivo diretamente via ssh e ele retorna o seguinte erro:

/bin/bash^M: bad interpreter: No such file or directory

Aqui está uma imagem da maneira exata como os comandos são escritos usando o editor nano:

EstaquestãoédiferentedeoutrasnoStackOverflowcomo Por que isso não acontece? trabalho crontab em execução no sentido de que o erro não estava na forma como o arquivo cron foi escrito, mas havia alguns espaços ocultos no arquivo optimize.sh.

    
por Rahul Ramesh 22.02.2015 / 18:35

3 respostas

2

Existem vários problemas:

  1. Você criou a multa em uma máquina Windows e a copiou para o servidor. A menos que você tenha um modo de "transferência de texto", isso deixa as terminações CR / LF para cada linha. Como sugerido por outros, execute dos2unix no arquivo para corrigir isso.

  2. Remova os espaços iniciais do #! linha, como já sugerido por outros.

  3. Não escreva para /var/log/cron.log. Esse é um arquivo de log do sistema e você não deve gravar nele.

  4. Não use chmod -R 777 para tornar um único arquivo executável. Em vez disso, use chmod 755 ou melhor ainda apenas chmod a+x .

  5. Também apontado por outros, quando você usa crontab -e o sistema sabe quem você é, então o formato crontab não deve incluir o nome de usuário.

  6. Em vez de echo 'date' , considere simplesmente date .

por 22.02.2015 / 21:23
0

Atualizar (do nosso bate-papo):

A sua pergunta mostra espaços no início de #!/bin/bash , por favor, certifique-se de que não existem. Além disso, se você fez alguma cópia do Windows para Linux, execute o seguinte comando, para remover qualquer caractere ^M e tente executar o script novamente:

    sed -i s/{ctrl+v}{ctrl+m}// /usr/local/optimize.sh

Ou se você tiver dos2unix run:

    dos2unix /usr/local/optimize.sh


Você está executando o trabalho às 10:00 toda sexta-feira.

O comando sh será executado às 10:00 da manhã, às sextas-feiras, todos os meses.

O que eu acho que você quer é:

00 10 * * *  /usr/local/optimize.sh > /var/log/cron.log 2>&1
    
por 22.02.2015 / 18:40
0

Seu formato de linha cron está errado. Aqui está um exemplo:

0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

i.e. não nomeie o usuário, você só colocará o nome de usuário se estiver adicionando linhas ao / etc / crontab, mas se você estiver usando crontab -e , então você está adicionando ao arquivo crontab do usuário atual.

    
por 22.02.2015 / 18:38