web-dev-qa-db-ja.com

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

タイトルが説明するように、ファイルを1日に1回Zipアーカイブに入れる必要があります。また、Zipファイルは/ var/www/htmlに移動する必要があります。このファイルでは、.phpスクリプトを使用してユーザーがダウンロードできます。

これを想定:

  • ファイルの絶対パスは/home/myuser/working-directory/file.txtです
  • /usr/scriptsのc​​ronjobsを使用して実行する必要があるすべてのスクリプトファイルを配置します
  • / var/www/htmlには管理者権限が必要なため、Sudo crontab -eの代わりにcrontab -eを使用して次のcronjobをプログラムしました

私の考えの結果は次のとおりです。

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も作成されるため、問題は特権に関連するものだと思います。しかし、crontabがルート権限で実行されていても、Zipを/var/www/htmlに移動することはできません。

何か案が?

また、.Zipは1日に1回作成されるため、新しいものをそこに移動する前に/ var/www/htmlから以前の.Zipを削除する必要があります。使ってみた

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

(上記のcreate-Zip.shを確認してください)が、それでも機能しません。/var/www/htmlはグループwww-dataに属し、その所有者もwww-dataです。

3
sciakysystem

コマンドを&&と結合すると、左側のコマンドが成功した場合にのみ右側のコマンドが実行されます。これは、/var/www/html/にZipファイルがないため、最初に実行したときにcrontabが失敗し、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
2
terdon