要約:
rsync
このコマンドを使用して、定期的にディレクトリをバックアップするようにシステムタイマーを設定しようとしています。rsync
端末で手動で実行すると動作するコマンドが作成されましたが、システムタイマーとして実行すると動作しません。
上海:
簡単な例として、次のディレクトリツリーがあります/home/trevor/test_dir/
。
dir_a/
file_a.png
dir_b/
file_b.png
dir_c/
file_c.png
rsync
バックアップのためにこのディレクトリを私のSSDにコピーしたいと思います(にマウントされています/my_ssd/
)。しかし、ディレクトリを除外したいですdir_a
。dir_b
だからコマンドを実行します。
rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/
このコマンドは端末で実行すると動作します。ディレクトリdir_a
とは除外されますが、保持dir_b
されますdir_c
。
次に、定期的にコマンドを実行するためのシステムサービスとタイマーを作成しました。システム/タイマーページArch Linux Wikiから)。次のサービスファイルを作成する
/etc/systemd/system/backup_test.service
:
[Unit]
Description=systemd backup test
[Service]
Type=simple
ExecStart=rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/
30秒ごとにコマンドを実行する次のタイマーファイル(例:)
/etc/systemd/system/backup_test.timer
:
[Unit]
Description=systemd backup test timer
[Timer]
OnCalendar=*:*:0/30
Persistent=true
[Install]
WantedBy=timers.target
私はスタートタイマーを使いますsystemctl start backup_test.timer
。タイマーは30秒ごとに実行されますが、「除外」部分は無視され、ディレクトリ全体がコピーされるようです。
デバッグの試み:
中括弧拡張の代わりにいくつかのオプションを使用してrsync
コマンドを実行してみました。つまり、 。それで、サポート延長がきちんと行われていないのが問題だと思います。--exclude
--exclude=/dir_a --exclude=/dir_b
--exclude={/dir_a,/dir_b}
次に、中括弧拡張自体が問題であることを確認するために、中括弧拡張を使用してより簡単なコマンドをテストしました。だからsystemdrsync
サービスのコマンドをtouch /home/trevor/test{1,2}.txt
。/home/trevor/test{1,2}.txt
答え1
私はsystemd service manual()を読んでこの問題を直接解決したと思いますman systemd.service
。このExecStart=
オプションはシェルコマンドラインを直接サポートしていないため、中かっこ拡張は期待どおりに実行されないようです。rsync
コマンドを行に渡してすべての操作をsh -c
実行しましたExecStart=
。
ExecStart=sh -c 'rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/'
引用:
$男 systemd.service ... シェルコマンドラインは直接サポートされていません。シェルなら コマンドラインを使用するには明示的に渡す必要があります。 一種のシェル実装です。例: ExecStart = sh -c 'dmesgコマンドの実行Tucker | ...