web-dev-qa-db-ja.com

init.d起動スクリプト

Glassfishソフトウェアのinit.dサービススクリプトを作成しようとしています。しかし、LSB init.dガイドラインでの私の理解は最良ではないようです。

これは、スクリプトが行うべきコマンドです。

/opt/glassfish/bin/asadmin start-domain
/opt/glassfish/bin/asadmin stop-domain
/opt/glassfish/bin/asadmin restart-domain

私のスクリプトはこのように見えますが、うまくいきませんでした。これは、init.dスクリプトを作成する最初の試みです。何か間違ったことをしたら教えてください。

注:編集の下に私の更新されたスクリプトを見てください:

#!/bin/sh
#
### BEGIN INIT INFO
#
# Provides:     glassfish
# Required-Start:   $local_fs $remote_fs $network
# Required-Stop:    $local_fs $remote_fs $network
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
# Short-Description:    Glassfish scipt (Non official)
# Description:  Start Glassfish domain as service.
#       Non official startup script.
#
### END INIT INFO

BASE=/opt/glassfish/bin
DEAMON=${BASE}/asadmin
USERID=root
NAME=glassfish
DESC="Glassfish domain service"
# PID file for the deamon
PIDFILE=/var/run/glassfish.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "$DEAMON" ] || exit 0

# Using LSB functions to perform the operations
. /lib/lsb/init-functions

do_start()
{
    start-stop-deamon --start --quiet --pidfile $PIDFILE --exec $DEAMON start-domain -- $NAME_OPTIONS
}

do_stop()
{
    start-stop-deamon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --exec $DEAMON stop-domain
}

case $1 in
    start)
        if init_is_upstart; then
            exit 1
        fi
        log_deamon_msg "Starting $DESC"
        do_start
        case "$?" in
            0) sendsigs_omit 
               log_end_msg 0 ;;
            1) log_progress_msg "already started"
               log_end_msg 0 ;;
            *) log_end_msg 1 ;;
        esac

        ;;
    stop)
        if init_is_upstart; then
            exit 0
        fi
        log_deamon_msg "Stopping $DESC"
        do_stop
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_progress_msg "already stopped"
               log_end_msg 0 ;;
            *) log_emd_msg 1 ;;
        esac

        ;;
    restart|force-reload)
        if init_is_upstart; then
            exit 1
        fi
        $0 stop
        $0 start
        ;;
    status)
        status_of_proc -p $PIDFILE $DEAMON && exit 0 || exit $?
        ;;
    *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2
        exit 3
        ;;
esac

:       

「/ bin/bash -x ./glassfish status」を実行すると、これが出力になります。

+ case "$FANCYTTY" in
+ true
++ /usr/bin/tput setaf 1
+ RED=''
++ /usr/bin/tput op
+ NORMAL=''
+ echo ' *  is not running'
 *  is not running
+ return 3
+ exit 3

しかし、開始するか停止するかは問題ではありません。結果は常に同じです。このスクリプトは、glassfishドメインサーバーを起動しません。スクリプトがなくてもすべて正常に動作します。

編集:

スクリプトをこれに変更しました:

#!/bin/sh

### BEGIN INIT INFO
#
# Provides:     glassfish
# Required-Start:   $local_fs $remote_fs $network
# Required-Stop:    $local_fs $remote_fs $network
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
# Short-Description:    Glassfish scipt (Non official)
# Description:  Start Glassfish domain as service.
#       Non official startup script
#
### END INIT INFO

# Using the LSB functions to perform the operations
. /lib/lsb/init-functions

BASE=/opt/glassfish/bin
NAME=glassfish
DAEMON=${BASE}/asadmin
SCRIPTNAME=/etc/init.d/$NAME

#PID file for the daemon
PIDFILE=/var/run/glassfish.pid

#If the daemon is not there, then exit
[ -x "$DAEMON" ] || exit 5

do_start()
{
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON start-domain
}

do_stop()
{
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
}

case $1 in
    start)
        #Check PID file
        if [ -e $PIDFILE ]; then
            status_of_proc -p $PIDFILE $DAEMON "$NAME process" && status="0" || status="$?"
            # IF SUCCESS dont start again
            if [ $status = "0" ]; then
                exit
            fi
        fi

        #Start the daemon
        log_daemon_msg "Starting the process" "$NAME"
        if do_start; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;

    stop)
        # Stop the daemon
        if [ -e $PIDFILE ]; then
            status_of_proc -p $PIDFILE $DAEMON "Stopping the $NAME process" && status="0" || status="$?"
            if [ "$status" = 0]; then
                do_stop
            fi
        else
            log_daemon_msg "$NAME process is not running"
            log_end_msg 0
        fi
        ;;

    restart)
        # Restart the daemon
            $0 stop && sleep 2 && $0 start
        ;;

    status)
        # Check status
        if [ -e $PIDFILE ]; then
            status_of_proc -p $PIDFILE $DAEMON "$NAME process" && exit 0 || exit $?
        else
            log_daemon_msg "$NAME Process is not running"
            log_end_msg 0
        fi
        ;;

    *)
        # Show help
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 3
        ;;
esac

変更後の出力は次のとおりです。

 * Starting the process glassfish                                                                                                                                                                                                            Waiting for domain1 to start .........
Successfully started the domain : domain1
domain  Location: /opt/glassfish/domains/domain1
Log File: /opt/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.

今すぐプロセスを開始できます。次に、サービスを停止すると次の問題が表示されます。

 * glassfish process is not running

しかし、プロセスは実行中であり、スクリプトは試行も中止もせずに中止します。/var/runの下にglassfish PIDファイルもありません。

1
user3772108

最後に私はそれを動作させます!

誰かが答えに興味があるなら。問題は、Glassfishが単独でPIDファイルを作成しなかったことです。そのため、プログラムをバックグラウンドで(&を使用して)起動し、PIDを出力する回避策が必要です。

理解のために、私はこの投稿を見ました:

パトリックの答え

https://unix.stackexchange.com/questions/137519/start-stop-daemon-not-working-as-expected-no-pid-file-was-written

l0b0の答え

https://stackoverflow.com/questions/9890062/how-to-run-a-program-and-know-its-pid-in-linux

小次郎の答え

https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-Shell-variables

Stack *(askUbuntu)-コミュニティは本当に素晴らしいコミュニティです! :)

そして、ここに完全な作業スクリプトがあります:

#!/bin/sh

### BEGIN INIT INFO
#
# Provides:     glassfish
# Required-Start:   $local_fs $remote_fs $network
# Required-Stop:    $local_fs $remote_fs $network
# Default-Start:    2 3 4 5
# Default-Stop:     0 1 6
# Short-Description:    Glassfish scipt (Non official)
# Description:  Start Glassfish domain as service.
#       Non official startup script by Bernhard Sumser.
#
### END INIT INFO

# Using the LSB functions to perform the operations
# NOT needed because no LSB functions used
#. /lib/lsb/init-functions

BASE=/opt/glassfish/bin
NAME=glassfish
DAEMON=${BASE}/asadmin
SCRIPTNAME=/etc/init.d/$NAME

#PID file for the daemon
PIDFILE=/var/run/glassfish.pid

#If the DAEMON is not there, then exit
[ -x "$DAEMON" ] || exit 0


do_start()
{
    $DAEMON start-domain &
    # Wait for child to exit before continuing
    wait
    # Make file with last background PID
    echo $! > $PIDFILE

    # Didn't work because the programm prints from the background. Without moving to the bg no $! can be outputed to file
    #(($DAEMON start-domain) & echo $! > $PIDFILE &)
}

do_stop()
{
    $DAEMON stop-domain
    if [ -e $PIDFILE ]; then
        rm -f $PIDFILE
    fi
}

check_root()
{
    if [ "$(id -u)" != "0" ]; then
        echo "You must be root to start, stop and restart $NAME."
        exit 4
    fi
}

check_process()
{
    # Check if the process is already running. Ignore grep line.
    result=`ps aux | grep /opt/glassfish/modules/glassfish.jar | grep -v grep | wc -l`
}

case $1 in
    start)
        check_root
        check_process
        if [ "$result" = "1"  ]; then
            echo "$NAME is already running"
        else
            # Check if PID file exists and delete it
            if [ -e $PIDFILE ]; then
                rm -f $PIDFILE
            else
                do_start
            fi              
        fi
    ;;

    stop)
        check_root
        if [ -e $PIDFILE ]; then
            do_stop
        else
            echo "$NAME is not running"
        fi
    ;;

    restart)
        check_root
        echo "Restarting $NAME..."
        check_process
        if [ "$result" = "1"  ]; then
            do_stop
            echo "Starting $NAME..."
            do_start
        fi                  
    ;;

    status)
        if [ -e $PIDFILE ]; then
            echo "$NAME is running. PID $(cat $PIDFILE)"
        else
            echo "$NAME is not running"
        fi
    ;;


    *)
            # Show help
            echo "Usage: $SCRIPTNAME {start|status|stop|restart}" >&2
            exit 3
    ;;
esac

/etc/init.d/の下にあるため、スクリプトにINIT INFOセクションがまだ必要かどうかわかりません。

これで、次のように通常のサービスとして使用できます。

Sudo service glassfish start

次に、rcの起動に追加すると、再起動後に起動します。

Sudo update-rc.d glassfish defaults
1
user3772108