Как следует из названия, мне нужно будет взять файл и поместить его в 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