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 decrontab -e
porque /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.txt
copiado /home/myuser
e 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*.zip
falhará e mv
nã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.txt
to /home/myuser/file.txt
é desnecessária, pois você só está usando isso para compactá-lo e depois excluí-lo. Os cd
comandos não são necessários, você pode usar o caminho completo. Também não há razão para isso cd
no 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