Linux
綁定到 VM 內的 ipc 埠時出現 systemd 服務權限錯誤
我正在使用 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
都沒有成功。
您的問題是您將服務作為使用者服務 (
--user
) 執行。使用者服務永遠無法在根文件系統中創建文件(/tmp
唯一的例外)。單元文件需要進入
/etc/systemd/system
(如果你手動將它放在那裡),或者進入/lib/systemd/system
(如果你使用包管理器安裝它)。然後你可以啟動/停止/啟用
sudo systemctl start dummy
等。如果您確實需要將其作為使用者服務執行,您可以考慮為二進製文件提供必要的功能(請參閱此處和此處)。另一個值得研究的選項是 polkit,但最好的選擇絕對是將其作為系統服務執行。