Linux 서비스를 시작하려고 하는데, 서비스를 시작하려고 하면 다음과 같은 문제가 발생합니다. 이 문제를 해결하는 방법에 대해 도움을 주세요.
사용자 Test_user는 sudoers 파일에서 ALL=(ALL) ALL로 설정됩니다.
Nov 17 11:20:24 systemd[1]: Starting wso2am-4.2.0.service...
Nov 17 11:20:24 wso2am-4.1.0[171210]: Starting the WSO2 Server ...
Nov 17 11:20:24 su[171211]: pam_unix(su:auth): auth could not identify
password for [Test_user] Nov 17 11:20:26 su[171211]: FAILED SU (to
Test_user) root on none Nov 17 11:20:27 wso2am-4.1.0[171210]:
Password: Password: su: Authentication failure Nov 17 11:20:27
systemd[1]: wso2am-4.2.0.service: Control process exited, code=exited
status=1 Nov 17 11:20:27 systemd[1]: wso2am-4.2.0.service: Failed
with result 'exit-code'.
스크립트에는 다음이 포함됩니다.
#! /bin/sh
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el8_7.x86_64"
startcmd='/var/wso2am-4.1.0/bin/api-manager.sh start > /dev/null &'
restartcmd='/var/wso2am-4.1.0/bin/api-manager.sh restart > /dev/null &'
stopcmd='/var/wso2am-4.1.0/bin/api-manager.sh stop > /dev/null &'
case "$1" in
start)
echo "Starting the WSO2 Server ..."
su -c "${startcmd}" Test_user
;;
restart)
echo "Re-starting the WSO2 Server ..."
su -c "${restartcmd}" Test_user
;;
stop)
echo "Stopping the WSO2 Server ..."
su -c "${stopcmd}" Test_user
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
답변1
나는 당신이 다음과 같은 것을 가지고 있다고 생각합니다 :
[Unit]
Description="WS02 Server"
[Service]
User=Test_user
ExecStart=sudo /usr/local/bin/wso2am-4.1.0
여기에는 몇 가지 문제가 있습니다.
sudo
상호작용을 위한 것입니다. 그 목적은 당신이 스크립트가 아닌 인간인지 확인하는 것입니다.- 을 설정했지만
User=
를 사용하여sudo
변경 하고 일부를root
실행 취소합니다 .User=
다음을 수행할 수 있습니다.
- 단순하지만 우아하지 않음:
:NOPASSWD
디자인 에/etc/sudoers
어긋나기 때문에 권장하지 않습니다.sudo
Test_user ALL=(ALL) NOPASSWD: ALL
- 설정하지 마십시오
User=
. 위의 가정에서는 을 사용하고 있지만 를Test_user
사용하여 즉시 루트로 다시 전환합니다sudo
.Test_user
프로세스가 더 이상 실행되지 않습니다. 이 경우에는 의미가 없습니다Test_user
. 다음을 수행하는 것이 좋습니다.
[Service]
ExecStart=/usr/local/bin/wso2am-4.1.0
- 나는 위의 가정이 틀렸을 가능성이 더 높다고 생각하며 당신은 단지 특정한 것을 강화하려고 노력하고 있습니다. 어쩌면 스크립트를 다음과 같이 호출한
Test_user
다음 해당 스크립트 내에서 작은 명령을 상승시킬 수도 있습니다. 이 경우 이를 꺼내서 접두사를ExecStartPre=
사용하여+
높은 권한을 부여하십시오 .
| Service | Script |
|------------------------------|----------------------------|
| [Service] | #!/bin/bash |
| User=Test_user | sudo wso2am-4.1.0 update |
| ExecStart=/path/to/script | wso2am-4.1.0 run |
becomes
[Service]
User=Test_user
ExecStartPre=+/usr/bin/wso2am4.1.0 update
ExecStart=/usr/bin/wso2am4.1.0 run
답변2
내 다른 대답은 귀하가 가질 수 있는 일반적인 경우 sudo
또는 su
귀하의 스크립트에 적용됩니다. 스크립트가 실제로 말하는 내용에 대한 세부 정보를 추가했으므로 여기에 보다 맞춤화된 답변이 있습니다.
추가한 스크립트는 몇 가지 작업만 수행합니다.
- 세트
$JAVA_HOME
start
,stop
, 명령을 특정 사용자restart
에게 전달apt-manager.sh
- 무엇을 하고 있는지 문서화하세요.
이는 이전 init 시스템에서 실행 되도록 설계된 것처럼 보이지만 systemd
. (). 해당 스크립트는 잊어버리고 동일한 작업을 올바르게 수행하는 서비스를 만드십시오.export
echo
su
case
>/dev/null
&
[Service]
Type=forking
User=Test_user
ExecStart=/var/wso2am-4.1.0/bin/api-manager.sh start
ExecStop=/var/wso2am-4.1.0/bin/api-manager.sh stop
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-2.el8_7.x86_64
유일한 차이점은 then 이 systemctl restart
실행될 것이라는 점입니다 . 아니요 , 그래서 귀하의 서비스에 추가하지 않았습니다. 단순 대신 구성을 다시 로드하는 경우 .ExecStop=
ExecStart=
ExecRestart=
apt-manager.sh restart
stop/start
ExecReload=/var/wso2am-4.1.0/bin/api-manager.sh restart
의 내용에 따라 api-manager.sh
스크립트를 삭제하고 자체적으로 시작되는 프로세스를 간단히 시작할 수도 있습니다. 삭제하고 Type=simple
서비스로 실행할 수도 있습니다.