systemctl 停止サービスが機能しない

systemctl 停止サービスが機能しない

私はこのサービスを/ 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 nexusiqExecStopに割り当てられた命令は呼び出されません。

また、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=forkingsystemdに指示します。ExecStart=生成されたプロセスは、systemdが追跡するデフォルトのPIDになります。

おすすめ記事