다음은 아래와 같이 파일을 수동으로 복사할 때 작동합니다.
userx@x:~$ cp -rv /opt/test-bak/* /opt/test/
'/opt/test-bak/file1' -> '/opt/test/file1'
'/opt/test-bak/file2' -> '/opt/test/file2'
'/opt/test-bak/file3' -> '/opt/test/file3'
'/opt/test-bak/subdir1/subfile1' -> '/opt/test/subdir1/subfile1'
'/opt/test-bak/subdir2/subfile2' -> '/opt/test/subdir2/subfile2'
그러나 시스템 서비스로 설치하면 "cannot stat '/opt/test-bak/*': No such file or Directory" 오류가 반환됩니다.
● testcopy.service - test usage of /bin/cp in systemd
Loaded: loaded (/etc/systemd/system/testcopy.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2019-04-21 14:55:16 +08; 4min 28s ago
Process: 7872 ExecStart=/bin/cp -rv /opt/test-bak/* /opt/test/ (code=exited, status=1/FAILURE)
Main PID: 7872 (code=exited, status=1/FAILURE)
Apr 21 14:55:15 userx@x systemd[1]: Started test usage of /bin/cp in systemd.
Apr 21 14:55:15 userx@x cp[7872]: /bin/cp: cannot stat '/opt/test-bak/*': No such file or directory
Apr 21 14:55:16 userx@x systemd[1]: testcopy.service: Main process exited, code=exited, status=1/FAILURE
Apr 21 14:55:16 userx@x systemd[1]: testcopy.service: Unit entered failed state.
Apr 21 14:55:16 userx@x systemd[1]: testcopy.service: Failed with result 'exit-code'.
내 서비스 파일은 다음과 같습니다.
[Unit]
Description=test usage of /bin/cp in systemd
[Service]
Type=simple
ExecStart=/bin/cp -rv /opt/test-bak/* /opt/test/
[Install]
WantedBy=multi-user.target
로그는 다음과 같이 표시됩니다
Apr 21 15:05:12 x systemd[1]: Started test usage of /bin/cp in systemd.
Apr 21 15:05:12 x cp[9892]: /bin/cp: cannot stat '/opt/test-bak/*': No such file or directory
Apr 21 15:05:12 x systemd[1]: testcopy.service: Main process exited, code=exited, status=1/FAILURE
Apr 21 15:05:12 x systemd[1]: testcopy.service: Unit entered failed state.
Apr 21 15:05:12 x systemd[1]: testcopy.service: Failed with result 'exit-code'.
누구든지 이것을 설명할 수 있나요?
답변1
명령줄에서 파일 이름 globbing 패턴을 사용하면 쉘은 globbing 패턴을 일치하는 파일 이름으로 확장하고 경로 이름 목록을 만든 다음 이를 호출하는 유틸리티( cp
여기)에 전달합니다.
서비스 파일에 지정하는 명령은 ExecStart
셸에서 실행되지 않습니다. 이는 파일 이름 globbing 패턴이 *
확장되지 않고 복사할 단일 리터럴 소스 경로로 호출된다는 것을 의미합니다 cp
./opt/test-bak/*
인라인 셸 스크립트에서 명령을 래핑해 볼 수 있습니다.
ExecStart=/bin/sh -c '/bin/cp -rv /opt/test-bak/* /opt/test/'
또는 짧은 쉘 스크립트로 명령을 래핑하십시오.
#!/bin/sh
/bin/cp -rv /opt/test-bak/* /opt/test/
그런 다음 전화하십시오.
나는 systemd에 대해 거의 아무것도 모르기 때문에 이를 수행하는 더 좋은 방법이 있을 수 있습니다.
*
glob이 아무것도 일치하지 않으면(디렉토리가 비어 있기 때문에) 이전과 동일한 문제가 발생한다는 점에 유의하십시오 . 기본적으로 일치하지 않는 와일드카드 패턴은 확장되지 않습니다.
개인적으로 나는
cd /opt/test-bak && /bin/cp -Rp -v . /opt/test
또는
rsync -ai /opt/test/bak-test/ /opt/test
둘 다 파일 이름을 생성하기 위해 쉘에 의존하지 않기 때문에 둘 다 랩핑 쉘 없이 실행할 수 있습니다. 이 경우 쉘 glob에 의존하지 않으면 숨겨진 파일과 디렉터리가 bak-test
복사될 수도 있습니다.