요약:
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 | ...