crontabsを使用して/var/www/htmlにzipファイルを作成する

crontabsを使用して/var/www/htmlにzipファイルを作成する

タイトルが説明しているように、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/myuserzip を に移動することはできません。/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

関連情報