네트워크 통신 서비스를 시뮬레이션하기 위해 vagrant를 사용하고 있습니다. 내 기본 상자는 ubuntu/bionic64입니다. VM으로 포팅하려는 애플리케이션은 C++로 작성되었으며 다음과 같이 ipc 주소에 바인딩됩니다.
sink.bind("ipc:///var/run/dummy-service");
따라서 이 서비스를 /usr/bin/에 컴파일하고 설치한 후 systemctl
다음 서비스 파일을 사용하여 필요한 서비스를 생성합니다.
[Unit]
Description=dummy manipulator
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/dummy-service.pid
ExecStart=/usr/bin/dummy-service
[Install]
WantedBy=multi-user.target
서비스 파일의 위치는 다음과 같습니다.$HOME/.config/systemd/user/dummy.service
따라서 다음 명령을 실행할 때:
systemctl --user enable dummy.service
systemctl --user start dummy.service
상태를 실행하는 동안 종료 코드 오류가 발생합니다.
dummy.service - belt and electrodes status manipulator
Loaded: loaded (/home/vagrant/.config/systemd/user/dummy.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2021-01-28 23:52:58 UTC; 18s ago
Process: 22420 ExecStart=/usr/bin/dummy-service (code=exited, status=1/FAILURE)
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: Starting dummy manipulator...
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: dummy.service: Control process exited, code=exited status=1
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: dummy.service: Failed with result 'exit-code'.
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: Failed to start dummy manipulator.
나중에 서비스가 허용되지 않았기 때문에 권한 오류라는 것을 알게 되었습니다 /var/run/
. 바인딩을 다음으로 전환했을 때 sink.bind("ipc:///tmp/dummy-service");
서비스는 분명히 문제 없이 실행되었습니다.
dummy.service - dummy manipulator
Loaded: loaded (/home/vagrant/.config/systemd/user/dummy.service; enabled; vendor preset: enabled)
Active: activating (start) since Fri 2021-01-29 00:06:04 UTC; 30s ago
/var/run
해당 주소에 바인딩된 서비스를 실행하려면 어떻게 해야 합니까 ?
수퍼유저로 바이너리 설치를 시도했고, chmod 777
서비스 파일의 옵션을 변경해 보았습니다.
User=root
Group=root
모두 실패했습니다.
답변1
문제는 서비스를 사용자 서비스( --user
)로 실행하고 있다는 것입니다. 사용자 서비스는 루트 파일 시스템에 파일을 생성할 수 없습니다( /tmp
유일한 예외).
/etc/systemd/system
유닛 파일은 (수동으로 넣은 경우) 또는 /lib/systemd/system
(패키지 관리자를 사용하여 설치한 경우) 넣어야 합니다 .
그런 다음 시작/중지/활성화 sudo systemctl start dummy
등을 수행할 수 있습니다.
사용자 서비스로 실행해야 하는 경우 바이너리에 필요한 기능을 제공하는 것을 고려할 수 있습니다(참조여기그리고여기). 살펴볼 가치가 있는 또 다른 옵션은 polkit이지만 가장 좋은 옵션은 확실히 시스템 서비스로 실행하는 것입니다.