서비스를 시작할 수 없습니다. 인증 시 비밀번호가 인식되지 않습니다.

서비스를 시작할 수 없습니다. 인증 시 비밀번호가 인식되지 않습니다.

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

여기에는 몇 가지 문제가 있습니다.

  1. sudo상호작용을 위한 것입니다. 그 목적은 당신이 스크립트가 아닌 인간인지 확인하는 것입니다.
  2. 을 설정했지만 User=를 사용하여 sudo변경 하고 일부를 root실행 취소합니다 .User=

다음을 수행할 수 있습니다.

  1. 단순하지만 우아하지 않음: :NOPASSWD디자인 에 /etc/sudoers어긋나기 때문에 권장하지 않습니다.sudo
Test_user  ALL=(ALL) NOPASSWD: ALL
  1. 설정하지 마십시오 User=. 위의 가정에서는 을 사용하고 있지만 를 Test_user사용하여 즉시 루트로 다시 전환합니다 sudo. Test_user프로세스가 더 이상 실행되지 않습니다. 이 경우에는 의미가 없습니다 Test_user. 다음을 수행하는 것이 좋습니다.
[Service]
ExecStart=/usr/local/bin/wso2am-4.1.0
  1. 나는 위의 가정이 틀렸을 가능성이 더 높다고 생각하며 당신은 단지 특정한 것을 강화하려고 노력하고 있습니다. 어쩌면 스크립트를 다음과 같이 호출한 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귀하의 스크립트에 적용됩니다. 스크립트가 실제로 말하는 내용에 대한 세부 정보를 추가했으므로 여기에 보다 맞춤화된 답변이 있습니다.

추가한 스크립트는 몇 가지 작업만 수행합니다.

  1. 세트$JAVA_HOME
  2. start, stop, 명령을 특정 사용자 restart에게 전달apt-manager.sh
  3. 무엇을 하고 있는지 문서화하세요.

이는 이전 init 시스템에서 실행 되도록 설계된 것처럼 보이지만 systemd. (). 해당 스크립트는 잊어버리고 동일한 작업을 올바르게 수행하는 서비스를 만드십시오.exportechosucase>/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 restartstop/startExecReload=/var/wso2am-4.1.0/bin/api-manager.sh restart

의 내용에 따라 api-manager.sh스크립트를 삭제하고 자체적으로 시작되는 프로세스를 간단히 시작할 수도 있습니다. 삭제하고 Type=simple서비스로 실행할 수도 있습니다.

관련 정보