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ファイルもありません。
最後に私はそれを動作させます!
誰かが答えに興味があるなら。問題は、Glassfishが単独でPIDファイルを作成しなかったことです。そのため、プログラムをバックグラウンドで(&を使用して)起動し、PIDを出力する回避策が必要です。
理解のために、私はこの投稿を見ました:
パトリックの答え
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