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
サービスとして実行することもできます。