appSevice
Linux에는 다음 명령을 사용하여 시작하고 중지하면 작동하는 서비스가 있습니다 .
sudo systemctl start appSevice.service;
sudo systemctl stop appSevice.service;
하지만 JAVA 코드에서 이를 실행하려고 하면 다음과 같습니다.
Runtime.getRuntime().exec(new String[]{"systemctl", "stop", "appService.service"});
...작동하지 않습니다. 다음 오류가 발생합니다.
> Failed to stop appService.service: Interactive authentication required
이것은 내 서비스입니다.
[Service]
Type=simple
ExecStart=/opt/soft/v1/launchAppService.ksh start
User=Jms-User
Restart=on-abort
이 오류를 방지하고 비밀번호를 제공하지 않고 서비스를 실행할 수 있는 방법이 있습니까?
답변1
세 가지 방법이 있습니다:
- 실을 넣고 빼세요
appService.service
. 그런 다음 다음을 통해 제어할 수 있습니다.~/.config/systemd/system/
User=
systemctl --user start appService.service
systemctl --user stop appService.service
- 폴킷 규칙을 추가합니다. 내 생각에 이 질문은 당신이 찾고 있는 질문에 매우 가깝습니다.systemd는 그룹에서 권한이 없는 사용자로 시작됩니다.. debian/ubuntu(polkit < 106)를 사용하는 경우 다음이 작동합니다.
/etc/polkit-1/localauthority/50-local.d/service-auth.pkla
---
[Allow yourname to start/stop/restart services]
Identity=unix-user:youname
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes
Arch/Redhat(polkit >= 106)을 사용하는 경우 다음이 작동합니다.
/etc/polkit-1/rules.d/service-auth.rules
---
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
subject.user == "yourname") {
return polkit.Result.YES;
} });
sudo
.sudo
종속성NOPASSWD:
구성이 필요하지 않고 간접적으로 호출되도록 설계되지 않았기 때문에 저는 이것을 별로 좋아하지 않습니다 . 이것이 바로 Polkit이 설계된 이유입니다.
/etc/sudoers.d/sysctl
---
youname ALL = NOPASSWD: /bin/systemctl
이것이 배포하려는 소프트웨어라면 확실히 polkit 솔루션을 사용하고 그룹으로 수행할 것입니다(링크된 답변에 따라). 즉, 사용자 이름을 하드코딩할 필요가 없지만 즐겨찾는 사용자를 그룹에 추가하여 기능을 얻을 수 있습니다.
답변2
어쩌면 사용자로부터 유닛을 생성해야 할까요?
systemctl edit --user --force --full myNewUnit
~/.config/systemd/user/myNewUnit.service
콘텐츠를 삽입하기 위해 편집기에서 새 파일이 열리고 루트 권한 없이 저장 및 사용됩니다.
systemctl enable --user myNewUnit
systemctl start --user myNewUnit
systemctl status --user myNewUnit
또는 열지 않고 편집해야 하는 경우--force
systemctl edit --user --full myNewUnit
아무 것도 엉망으로 만들지 않았으면 좋겠고 유용할 것 같아요