Создание zip-файлов в /var/www/html с помощью crontab

Создание zip-файлов в /var/www/html с помощью crontab

Как следует из названия, мне нужно будет взять файл и поместить его в zip-архив один раз в день; кроме того, zip-файл должен быть перемещен в /var/www/html, где .php-скрипты позволят пользователям загружать его.

Предположим следующее:

  • абсолютный путь к файлу/home/myuser/working-directory/file.txt
  • Я поместил все файлы скриптов, которые мне нужно запустить с помощью cronjobs, в/usr/scripts
  • Я запрограммировал следующее cronjob, используя sudo crontab -e, вместо crontab -e, потому что /var/www/html требует административных привилегий

Результаты моих размышлений таковы:

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

Ну... не работает. Я думаю, что проблема в чем-то, связанном с привилегиями, потому что я копируюсь file.txtв /home/myuser, а также создается zip. Но затем я не могу переместить zip в /var/www/html, даже если crontab запущен с привилегиями root.

Есть идеи?

Также... поскольку .zip создается раз в день, мне нужно удалить предыдущий .zip из /var/www/html перед тем, как переместить туда новый. Я пробовал использовать

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

(проверьте create-zip.sh выше), но это тоже не работает... так что, я думаю, что-то не так с привилегиями. /var/www/html входит в группу www-data, и его владельцем также является www-data.

решение1

Объединение команд с &&означает, что команда справа будет запущена только в том случае, если команда слева была успешной. Это означает, что ваш crontab не будет выполнен в первый раз, поскольку в нем нет zip-файла, /var/www/html/поэтому rm /var/www/html/my-zip-file*.zipне будет выполнен и mvне будет выполнен.

Итак, вы можете либо создать файл с нужным именем, который можно удалить, и сохранить ту же команду cron:

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

Или вы можете использовать ;вместо &&:

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

Вы также делаете этот путь более сложным, чем он должен быть. Копирование в /home/myuser/myworkingdir/file.txtне /home/myuser/file.txtнужно, так как вы используете его только для того, чтобы сжать его, а затем удалить. Команды cdне нужны, вы можете использовать полный путь. Также нет смысла cdв конце. Все, что вам нужно, это одна команда для удаления любых файлов zip из целевого каталога и одна команда для их сжатия:

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

Связанный контент