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_a. dir_b그래서 명령을 실행합니다.

rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/

이 명령은 터미널에서 실행하면 작동합니다. 디렉토리 dir_a및 는 제외되지만 dir_b은 유지됩니다 dir_c.

다음으로 주기적으로 명령을 실행하기 위해 시스템 서비스와 타이머를 만들어 보았습니다.시스템/타이머 페이지아치 리눅스 위키에서). 다음 서비스 파일을 만듭니다

/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}

다음으로, 중괄호 확장 자체가 문제인지 확인하기 위해 중괄호 확장을 사용하여 더 간단한 명령을 테스트해 보았습니다. 그래서 systemd rsync서비스의 명령을 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 |
...

관련 정보