タイトルが説明しているように、1 日に 1 回、ファイルを取得して zip アーカイブに入れる必要があります。また、zip ファイルは /var/www/html に移動する必要があります。ここで、.php スクリプトを使用して、ユーザーがダウンロードできるようにします。
これを前提とします:
- ファイルの絶対パスは
/home/myuser/working-directory/file.txt
- cronjobsを使用して実行する必要があるすべてのスクリプトファイルを
/usr/scripts
- /var/www/htmlには管理者権限が必要なので
sudo crontab -e
、 の代わりにを使用して次のcronjobをプログラムしました。crontab -e
私の考えの結果は次のとおりです。
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
にコピーされ、zip も作成されるので、問題は権限に関連するものだと思います。しかし、 crontab がルート権限で実行されている場合でも、/home/myuser
zip を に移動することはできません。/var/www/html
何か案が?
また、.zipは1日に1回作成されるため、新しい.zipをそこに移動する前に、以前の.zipを/var/www/htmlから削除する必要があります。
rm /var/www/html my-zip-file-*.zip
(上記の create-zip.sh を確認してください) しかし、これも機能しません。権限に問題があると思います。/var/www/html はグループ www-data に属しており、その所有者も www-data です。
答え1
コマンドを で結合すると、&&
左側のコマンドが成功した場合にのみ右側のコマンドが実行されます。つまり、 には zip ファイルがないため、crontab は最初の実行時に失敗し、/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
必要はありません。 は、それを zip に圧縮して削除するだけだからです。 コマンドはcd
不要で、フルパスを使用できます。cd
最後に を付ける理由もありません。 必要なのは、ターゲット ディレクトリから zip ファイルを削除するコマンド 1 つと、それらを zip に圧縮するコマンド 1 つだけです。
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