Red Hatでプログラムをサービスとしてインストールする必要があります。自身の背景、PIDファイルの管理、独自のログの管理は行いません。実行され、STDOUTおよびSTDERRに出力されます。
ガイドとして標準のinitスクリプトを使用して、以下を開発しました。
#!/bin/bash
#
# /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf
# Source function library.
. /etc/rc.d/init.d/functions
prog="someprog"
exec="/usr/local/bin/$prog"
[ -e "/etc/sysconfig/$prog" ] && . "/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/$prog"
RETVAL=0
check() {
[ `id -u` = 0 ] || exit 4
test -x "$exec" || exit 5
}
start() {
check
if [ ! -f "$lockfile" ]; then
echo -n $"Starting $prog: "
daemon --user someproguser "$exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch "$lockfile"
echo
fi
return $RETVAL
}
stop() {
check
echo -n $"Stopping $prog: "
killproc "exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f "$lockfile"
echo
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status "$prog"
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
/etc/init.dにある既存のスクリプトの一部をコピーして貼り付け、変更するのが私の間違いだったのかもしれません。いずれの場合も、結果のサービスは奇妙な動作をします。
service someprog start
プログラムで開始すると、ターミナルに出力され、コマンドが完了しません。- CTRL-Cを押すと、「セッションが終了し、シェルを強制終了しています... ...強制終了しました。失敗しました」と出力されます。シェルプロンプトを再び表示するには、これを行う必要があります。
- 今実行
service someprog status
すると、実行中であると表示され、そのPIDがリストされます。私はそれを見ることができるps
ので、走っています。 - 今実行する
service someprog stop
と、停止に失敗します。で引き続き実行されていることを確認できps
ます。
someprog
バックグラウンドに送信してサービスとして管理するために何を変更する必要がありますか?
編集:私は今、いくつかの関連する質問を見つけましたが、どちらも「何か他のことをする」以外の実際の答えはありません:
編集:ダブルフォークに関するこの答えは私の問題を解決したかもしれませんが、今私のプログラム自体はダブルフォークであり、それは機能します:https://stackoverflow.com/a/9646251/898699