시스템 서비스 시작이 시작 스크립트에서 명령을 찾을 수 없습니다.

시스템 서비스 시작이 시작 스크립트에서 명령을 찾을 수 없습니다.

데몬으로 실행하고 싶은 프로그램이 있는데, 이를 가상 프로그램이라고 부르겠습니다. 해당 매개변수를 구문 분석해야 하므로 시작 스크립트, 구성 파일, 프로그램 자체 및 해당 종속성이 모두 동일한 폴더에 필요합니다 /usr/share/dummy. 각 프로그램, 스크립트 등은 0755입니다.

(예, 이것이 완벽하지 않다는 것을 알고 있습니다. 일반적으로 프로그램은 bin, dependency lib, config etc또는 다른 곳에 있을 것입니다. 이것은 단지 개념 증명 데몬 테스트일 뿐입니다.)


프로그램 서비스 파일:

[Unit]
Description=Dummy daemon program
After=default.target

[Service]
User=root
ExecStart=/usr/share/dummy/dummyd_start.sh

[Install]
WantedBy=default.target

내 시작 스크립트(다소):

#!/bin/bash

#Some config parsing...

sudo ./dummy $PARAM

현재는 매개변수를 처리해야 하고 프로그램에도 루트 권한이 필요하기 때문에 서비스 파일에서 프로그램 자체를 호출할 수 없습니다.

해당 위치()에서 시작 스크립트를 실행 하면 sudo ./dummy_start.sh프로그램이 제대로 실행됩니다. 하지만 systemd시작하면 프로그램 자체를 찾을 수 없습니다.

Mar 10 16:42:52 debian systemd[1]: Started Dummy daemon program.
Mar 10 16:42:52 debian bash[10690]: sudo: ./dummy: command not found
Mar 10 16:42:52 debian systemd[1]: dummy.service: Main process exited, code=exited, status=1/FAILURE
Mar 10 16:42:52 debian systemd[1]: dummy.service: Failed with result 'exit-code'.

서비스 파일 호출을 변경하면(예 ExecStart=/bin/bash -c /usr/share/dummy/dummyd_start.sh: 전체 절대 경로를 통해 시작 스크립트에서 프로그램을 호출하면(따라서 이와 같은 시작 스크립트에서 sudo ./usr/share/dummy/dummy $PARAM) 프로그램을 찾을 수 있지만 종속성은 찾을 수 없습니다.

Mar 10 16:26:23 debian systemd[1]: Started Dummy daemon program.
Mar 10 16:26:23 debian sudo[10420]:     root : PWD=/ ; USER=root ; COMMAND=./usr/share/dummy/dummy -p some_parameters
Mar 10 16:26:23 debian sudo[10420]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=0)
Mar 10 16:26:23 debian bash[10421]: ./usr/share/dummy/dummy: error while loading shared libraries: libmysqlclient.so.21: cannot open shared >
Mar 10 16:26:23 debian sudo[10420]: pam_unix(sudo:session): session closed for user root
Mar 10 16:26:23 debian systemd[1]: dummy.service: Main process exited, code=exited, status=127/n/a
Mar 10 16:26:23 debian systemd[1]: dummy.service: Failed with result 'exit-code'.

내가 무엇을 놓치고 있는지 아는 사람 있나요?

답변1

코드는 스크립트가 이 줄을 실행할 때 어떤 디렉터리에 있든 현재 디렉터리를 검색 ./dummy $PARAM하려고 합니다 . dummy이것이 스크립트가 호출되는 디렉토리를 나타낼 수 있다는 것은 일반적인 오해입니다.

스크립트를 수동으로 시작 cd /usr/share/dummy; ./dummyd_start.sh하거나 파일 관리자에서 클릭하여 비슷한 작업을 수행할 수 있을 것 같습니다.

코드가 특정 현재 작업 디렉터리에 의존하는 경우 를 사용해야 합니다 cd.

또 다른 옵션은 실행 중인 스크립트의 위치를 ​​확인하고 이를 호출된 모든 스크립트 앞에 추가하는 것입니다.

관련 정보