Crie arquivos zip em /var/www/html usando crontabs

Crie arquivos zip em /var/www/html usando crontabs

Como o título explica, eu precisaria pegar um arquivo e colocá-lo em um arquivo zip uma vez por dia; Além disso, o arquivo zip deve ser movido para /var/www/html, onde scripts .php permitem que os usuários o baixem.

Supondo isso:

  • o caminho absoluto do arquivo é/home/myuser/working-directory/file.txt
  • Coloquei todos os arquivos de scripts que preciso para executar usando cronjobs em/usr/scripts
  • Programei o seguinte cronjob usando sudo crontab -e, em vez de crontab -eporque /var/www/html precisa de privilégios administrativos

Os resultados dos meus pensamentos são os seguintes:

create-zip.sh

#!/bin/bash

cp /home/myuser/myworkingdir/file.txt /home/myuser/file.txt && cd /home/myuser && zip my-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip file.txt && rm file.txt && rm /var/www/html/my-zip-file*.zip && mv my-zip-file*.zip /var/www/html && cd

sudo crontab -e

@daily sh /usr/scripts/create-zip.sh

Bem .. não funciona. Acho que o problema é algo relacionado a privilégios porque sou file.txtcopiado /home/myusere também é criado o zip. Mas não consigo mover o zip para /var/www/html, mesmo que o crontab esteja sendo executado com privilégios de root.

Qualquer ideia?

Além disso... como um .zip é criado uma vez por dia, eu precisaria remover o .zip anterior de /var/www/html antes de mover o novo para lá. Eu tentei usar

rm /var/www/html my-zip-file-*.zip

(verifique o create-zip.sh acima), mas também não funciona .. então acho que há algo errado com privilégios. /var/www/html está no grupo www-data e seu proprietário também é www-data.

Responder1

Unir comandos &&significa que o comando da direita só será executado se o da esquerda for bem-sucedido. Isso significa que seu crontab falhará na primeira vez que for executado, pois não há nenhum arquivo zip, /var/www/html/portanto ele rm /var/www/html/my-zip-file*.zipfalhará e mvnão será executado.

Portanto, você pode criar um arquivo com o nome correto que pode ser excluído e manter o mesmo comando cron:

touch /var/www/html/my-zip-file.zip

Ou você pode usar ;em vez de &&:

cp /home/myuser/myworkingdir/file.txt /home/myuser/file.txt && 
cd /home/myuser && 
zip my-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip file.txt && 
rm file.txt && 
rm /var/www/html/my-zip-file*.zip ; 
mv my-zip-file*.zip /var/www/html && cd

Você também está tornando esse caminho mais complexo do que precisa ser. A cópia de /home/myuser/myworkingdir/file.txtto /home/myuser/file.txté desnecessária, pois você só está usando isso para compactá-lo e depois excluí-lo. Os cdcomandos não são necessários, você pode usar o caminho completo. Também não há razão para isso cdno final. Tudo que você precisa é de um comando para remover quaisquer arquivos zip do diretório de destino e um comando para compactá-los:

rm /var/www/html/my-zip-file*.zip &&
 zip /var/www/htmlmy-zip-file-$(date "+%b_%d_%Y_%H.%M.%S").zip /home/myuser/myworkingdir/file.txt

informação relacionada