데몬으로 실행하고 싶은 프로그램이 있는데, 이를 가상 프로그램이라고 부르겠습니다. 해당 매개변수를 구문 분석해야 하므로 시작 스크립트, 구성 파일, 프로그램 자체 및 해당 종속성이 모두 동일한 폴더에 필요합니다 /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
.
또 다른 옵션은 실행 중인 스크립트의 위치를 확인하고 이를 호출된 모든 스크립트 앞에 추가하는 것입니다.