web-dev-qa-db-ja.com

Cronはスクリプトの最初の部分のみを実行します

これは私が使用するスクリプトです:

find /path/backups/ -type f -mtime -2 -printf '%P\n' | rsync -avz --progress --delete --exclude-from=- -e "ssh -p 512" /path/backups/ me@Host:/remote/path/server-backups/

これはログからのものです:

> Jan 21 15:32:01 servername CRON[14654]: (serveruser) CMD (find /path/backups/ -type f -mtime -2 -printf ')

cron.dcrontab -e、およびcron.dailyを使用してみました。 crontabファイルにスクリプトを直接配置することと、.shスクリプトファイルを呼び出すことの両方。これを解決する方法はありますか?

2
Ayys

%cronで特別な意味を持つため、コマンドは切り捨てられます。 man 5 crontabから:

   The ``sixth'' field (the rest of the line) specifies the command to  be
   run.   The  entire  command  portion  of the line, up to a newline or %
   character, will be executed by /bin/sh or by the Shell specified in the
   Shell  variable of the crontab file.  Percent-signs (%) in the command,
   unless escaped with backslash (\), will be changed into newline charac‐
   ters,  and  all  data  after the first % will be sent to the command as
   standard input. There is no way to split a  single  command  line  onto
   multiple lines, like the Shell's trailing "\".

ログに記録されたコマンドが次のように見える理由を説明します。

CMD (find /home/steeldriver/forums/tests -type f -mtime +1 -printf ')

エスケープが機能することを示すために、以下を指定します。

$ ls -l tests
total 12
-rw-rw-r-- 1 steeldriver steeldriver  0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 22 Oct 27 22:18 A9E27.txt
-rw-rw-r-- 1 steeldriver steeldriver 10 Oct 27 22:19 ffn2eG6.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt

次に、crontabを次のように追加します。

* * * * * find /home/steeldriver/forums/tests -type f -mtime +1 -printf '\%P\0' | rsync -0av --exclude-from=- /home/steeldriver/forums/tests/ /home/steeldriver/forums/newtests/ 2>&1 > /home/steeldriver/forums/backup.log

(これはnullで終わるフォーム\0を使用することに注意してください)ログファイルを生成します。

$ cat backup.log
sending incremental file list
created directory /home/steeldriver/forums/newtests
./
A8eVAmK.txt
sBHFgkv.txt

sent 250 bytes  received 113 bytes  726.00 bytes/sec
total size is 43  speedup is 0.12

バックアップが正常に実行され、新しいファイルのみがコピーされたことを示します。

$ ls -l newtests
total 4
-rw-rw-r-- 1 steeldriver steeldriver  0 Jan 22 14:22 A8eVAmK.txt
-rw-rw-r-- 1 steeldriver steeldriver 43 Jan 22 14:22 sBHFgkv.txt

ご使用のcrontabの外部でエスケープをテストすることはできません。ターミナルでは、エラーが発生しますfind

3
steeldriver

別のアプローチをお勧めします。一時ファイルを使用すると、作業が楽になり、cronジョブで問題を引き起こす可能性のあるパイプの使用を避けることができます。

ここでのプロセスはかなり簡単です。最初にコマンドを発行する

find ./ -daystart -mtime +2 >myfile

注:

上記は整数日を使用するため、2〜3日前のファイルと一致します。*必要に応じて変更するか、より正確な選択のために-mminとminutesを使用します。一致する結果はファイルmyfileに書き込まれ、コマンドが実行されるたびに上書きされます。

次にコマンドを発行します:sed 's|./||' myfile >EXCL_list不要なプレフィックスを取り除きます。ファイルEXCL_listは、コマンドが実行されるたびに上書きされます。

最後にコマンドを発行します:

rsync -Pav --exclude-from=EXCL_list --delete-excluded source/ dest

rsyncスイッチの説明:

-P --partial --progressと同じ

-aアーカイブモード

-v詳細

--exclude-from=EXCL_list FILEから除外パターンを読み取ります

--delete-excludedまた、dest dirsからexcluded filesを削除します

詳細情報およびその他のオプションの詳細については、man rsync

仮定:

コマンドは、処理するファイルとフォルダーを含むソースディレクトリで実行されます。

rsyncコマンドのdestは、書き込み権限があるマウントされた宛先です。

これが役立つことを願っています。

ソース:

http://www.linuxquestions.org/questions/linux-general-1/rsync-only-60-day-old-files-580357

https://unix.stackexchange.com/questions/92346/why-does-find-mtime-1-only-return-files-older-than-2-days

https://serverfault.com/questions/279609/what-exactly-will-delete-excluded-do-for-rsync

man find

man rsync

1
Elder Geek