私はこのサービスを/ etc / systemd / systemに次のように書いていますnexusiq.service
。
[Unit]
Description=Nexus IQ Service
After=network.target
[Service]
Type=simple
ExecStart=/etc/init.d/nexus-iq-server start
ExecStop=/etc/init.d/nexus-iq-server stop
User=root
Restart=on-abort
TimeoutSec=600
[Install]
WantedBy=multi-user.target
ExecStart および ExecStop で呼び出される /etc/init.d のスクリプトは、nexus-iq-server
「start」または「stop」を引数として指定するかどうかに応じて、次の操作を行います。
NEXUS_IQ_SERVER_HOME=/apps/nexus/nexus-iq-server
VERSION=1.127.0-01
JAVA_OPTIONS="-Xmx4096m -XX:+UseG1GC"
RUN_AS_USER=root
do_start()
{
cd $NEXUS_IQ_SERVER_HOME
su -m $RUN_AS_USER --command "java $JAVA_OPTIONS -jar nexus-iq-server-$VERSION.jar server config.yml 2> stderr.log &"
echo "Started nexus-iq-server"
}
do_console()
{
cd $NEXUS_IQ_SERVER_HOME
su -m $RUN_AS_USER --command "java $JAVA_OPTIONS -jar nexus-iq-server-$VERSION.jar server config.yml 2> stderr.log"
}
do_stop()
{
pid=`ps aux | grep nexus-iq-server | grep '.jar server' | grep -vE '(stop|grep)' | awk '{print $2}'`
kill $pid
echo "Killed nexus-iq-server - PID $pid"
}
do_usage()
{
echo "Usage: nexus-iq-server [console|start|stop]"
}
case $1 in
console)
do_console
;;
start)
do_start
;;
stop)
do_stop
;;
*)
do_usage
;;
esac
サービスを有効にしました。
コマンドを実行すると、
systemctl start nexusiq
ExecStartに割り当てられたコマンドが正しく呼び出されます。ただし、命令を実行すると、systemctl stop nexusiq
ExecStopに割り当てられた命令は呼び出されません。
また、systemctl status nexusiq
次のコマンドを実行すると、サービスが無効になっているように見えます。
● nexusiq.service - Nexus IQ Service
Loaded: loaded (/etc/systemd/system/nexusiq.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Wed 2021-11-17 12:56:03 CET; 16s ago
Process: 14806 ExecStop=/etc/init.d/nexus-iq-server stop (code=exited, status=0/SUCCESS)
Process: 14800 ExecStart=/etc/init.d/nexus-iq-server start (code=exited, status=0/SUCCESS)
Main PID: 14800 (code=exited, status=0/SUCCESS)
Nov 17 12:56:03 nexusiq2 systemd[1]: Started Nexus IQ Service.
Nov 17 12:56:03 nexusiq2 su[14801]: (to root) root on none
Nov 17 12:56:03 nexusiq2 nexus-iq-server[14800]: Started nexus-iq-server
この問題の原因と解決策を説明できる人はいますか?
答え1
Type=forking
代わりに必要ですType=simple
。
マニュアルページには次のように記載されています。
- simpleに設定されている場合(ExeStart =が指定されているがType =またはBusName =が指定されていない場合はデフォルト)、サービスマネージャはデフォルトのサービスプロセスが分岐した直後にデバイスが起動すると見なします。 ExecStart =で構成されたプロセスは、サービスの基本プロセスになると予想されます。このモードでは、プロセスがシステム内の他のプロセスに機能を提供する場合、サービスマネージャは実行を開始するため、サービスが開始される前に適切な通信チャネルをインストールする必要があります(たとえば、ソケットを有効にすることによってsystemdによってソケットが確立されます)。すぐに、次はメインサービスプロセスを作成した後、サービスのバイナリを実行する前に-upユニットを動作させます。これは、サービスのバイナリを正常に呼び出せない場合(たとえば、選択したUser =が存在しない場合、またはサービスバイナリが欠落している場合など)、単純サービスのsystemctl startコマンドラインが成功を報告することを意味します。
- ブランチに設定されている場合、ExecStart =で設定されたプロセスは開始の一部としてブランチ()を呼び出す必要があります。起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続き基本サービスプロセスとして実行され、親プロセスが終了すると、サービスマネージャはそのユニットが開始されたと見なす。これは既存のUNIXサービスの動作です。この設定を使用する場合は、systemdがサービスの基本プロセスを確実に識別できるように、PIDFile =オプションも使用することをお勧めします。親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。
通常/etc/init.d/nexus-iq-server start
システム化されたタスクが完了すると、サービスは完了します。したがって、非アクティブ(停止)と見なされます。 systemd
残りのJavaプロセスは、クリーンアップして終了する必要があるプロセスとして扱われます。 systemctl stop
デバイスが停止したため、何もしません。
プロセスが作成され終了することを期待するようにType=forking
systemdに指示します。ExecStart=
生成されたプロセスは、systemdが追跡するデフォルトのPIDになります。