我正在尝试启动 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
,但立即使用 切换回 rootsudo
。Test_user
不再运行该进程。在这种情况下,没有任何意义Test_user
,你最好这样做:
[Service]
ExecStart=/usr/local/bin/wso2am-4.1.0
- 我认为我上面的假设更有可能是错误的,你只是想提升一些具体的东西。也许您将脚本称为 as
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
唯一的区别是systemctl restart
会运行ExecStop=
then ExecStart=
。没有ExecRestart=
,所以我没有将其添加到您的服务中。如果apt-manager.sh restart
重新加载其配置而不是简单的stop/start
,那么您可以添加ExecReload=/var/wso2am-4.1.0/bin/api-manager.sh restart
。
根据 中的内容api-manager.sh
,您也许还可以删除该脚本并简单地启动它自行启动的任何进程。您也可以删除它,并作为Type=simple
服务运行。