systemd 및 copy(/bin/cp): 해당 파일이나 디렉터리가 없습니다.

systemd 및 copy(/bin/cp): 해당 파일이나 디렉터리가 없습니다.

다음은 아래와 같이 파일을 수동으로 복사할 때 작동합니다.

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복사될 수도 있습니다.

관련 정보