次のコマンドを使用してZNCを起動しようとしています。
service znc start
このエラーが発生します。
Starting znc: /usr/bin/dirname: extra operand `2>&1.pid'
Try `/usr/bin/dirname --help' for more information.
[FAILED]
init.dスクリプトは次のとおりです。
exec=/usr/bin/znc
prog=znc
config=/var/lib/znc
runas=znc
lockfile=/var/lock/subsys/$prog
start() {
[ -x $exec ] || exit 5
echo -n $"Starting $prog: "
# if not running, start it up here, usually something like "daemon $exec"
daemon --user $runas "$exec -d $config >/dev/null 2>&1"
# If you're reckless with your system, comment the line above and
# uncomment this one below... I just don't get it why
#daemon "$exec -r -d $config >/dev/null 2>&1"
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
この問題の原因が何であるかを知っている人がいます。
セントースを書いています。
答え1
質問のコードに基づいてサンプル初期化スクリプトを作成し、二重引用符を最後から中央に移動して1行を変更する必要があると判断しました。
daemon --user $runas "$exec" -d $config >/dev/null 2>&1
daemon()
の関数は、/etc/init.d/functions
引数ではなく最初の引数を調べて、プログラムパスをデフォルト名に戻し、それを使用してPIDロックファイルを派生させます。文字列全体を(不正確に)引用することによって、PIDファイルは2>&1.pid
エラーが示すものと誤って識別されます。
ZNCプログラムがそれ自体を保護せずにバックグラウンドに分岐している場合、ここに示されているコード行はまだ無期限に中断されます。 ZNCがないため、この部分をテストすることはできませんが、CentOSデーモンユーティリティがバックグラウンドジョブのオプションを提供していないことを考えると、この基本的な要件はZNC自体で解決されたことを願っています。
答え2
新しいユーザーアカウントを作成したとします。
sudo useradd --system --shell /sbin/nologin --comment "Account to run ZNC daemon" --user-group znc
構成ファイルを作成しました。
CentOSのinit.dスクリプトは次のとおりです。
#!/bin/sh
#
# znc - Advanced IRC Bouncer INIT script #
# description: An Advanced IRC bouncer INIT script for
# Source function library.
. /etc/rc.d/init.d/functions
exec=/usr/bin/znc
prog=znc
config=/var/lib/znc
runas=znc
lockfile=/var/lock/subsys/$prog
start() {
[ -x $exec ] || exit 5
echo -n $"Starting $prog: "
# if not running, start it up here, usually something like "daemon $exec"
daemon --user $runas "$exec -d $config >/dev/null 2>&1"
# If you're reckless with your system, comment the line above and
# uncomment this one below... I just don't get it why
# daemon "$exec -r -d $config >/dev/null 2>&1"
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
# stop it here, often "killproc $prog"
killproc $prog -TERM
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
reload() {
echo -n $"Reloading $prog: "
# stop it here, often "killproc $prog"
killproc $prog -HUP
retval=$?
echo
}
restart() {
stop
start
}
rh_status() {
# run checks to determine if the service is running or use generic status
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|reload|restart|condrestart|try-restart}"
exit 2
esac
exit $?
chmod +x
それ以外の場合は、crontabが利用可能であることを確認してください。
*/10 * * * * /usr/bin/znc >/dev/null 2>&1
あなたのcrontabに(crontab -e
)
より積極的な検査のために、10をより低い値に置き換えます。
答え3
daemon --user $runas --check $exec "$exec -d $config >/dev/null 2>&1"
。追加した--check $exec
.daemon 関数は pid ファイルznc
から取得できず、 "null 2>&1" と評価されます。これにより精度が保証されます。またはパスすることができます。"$exec -d $config >/dev/null 2>&1"
/var/run/znc.pid
${1##*/}
--check $exec
pidfile=/var/run/$(basename $exec).pid daemon --user $runas --pidfile $pidfile "$exec -d $config >/dev/null 2>&1"
すべての内容が "$exec -d $config>/dev/null 2>&1"のように引用されていない場合、 "daemon"関数のstdoutとstderrがリダイレクトされ、"daemon"関数のすべての出力メッセージまたはエラーが発生します。起動中は表示されません。必要に応じてもっと大きく叫ぶ必要があります。閉じてはいけません。引用されると、$ execのstdoutとstderrが正しくリダイレクトされるように、デーモン関数に '$ *'として渡されます。 $exec自体を参照することは、名前やパスにスペースがなければ何もしません。
システムデーモンは開いているすべてのFDを閉じ、0、1、2自体で/ dev / nullを開き、ターミナルから切り離して出力ログを使用するため、/ dev / nullにリダイレクトする必要はありません。ここで「znc」は redir 自体を実行しないので、I/O redir が必要だと思います。