systemd サービスとして実行すると rsync コマンドが機能しない

systemd サービスとして実行すると rsync コマンドが機能しない

要約:

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_adir_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 |
...

関連情報