私は通常、killall
を使用してプロセスを強制終了します。
killall markdoc
しかし、このコマンドでプロセスが正常に終了するかどうかはわかりません。このコマンドは正常に終了しますか?そうでない場合、どうすればその名前のプロセスを正常に終了できますか?
あなたの質問は明確ではありません、あなたはタイトルでデーモンについて話しますが、本文では一般的なプロセスについてのみ話します。
デーモンには、それを停止するための特定の手段があります。たとえば、Debianでは
service daemon-name stop
または
/etc/init.d/daemon-name stop
他のディストリビューション/ OSで使用される他のinitscript標準にも同様の構文が存在します。
デーモン以外のプロセスを強制終了するには、それが何らかの形で制御不能であると想定して、killall
またはpkill
をデフォルトで使用することを前提として、SIGTERM
( 15)シグナル。きちんと作成されたアプリケーションは、このシグナルを受信したときにキャッチして正常に終了する必要があります。同じ名前のプロセスが多数ある場合、これらのユーティリティが複数のプロセスを強制終了する可能性があることを考慮してください。
それがうまくいかない場合は、SIGINT
(2)、SIGHUP
(1)、そして最後の手段としてSIGKILL
(9)を試すことができます。この最後の信号はアプリケーションでキャッチできないため、クリーンアップを実行できません。このため、できる限り回避する必要があります。
pkill
とkillall
はどちらも、-NAME
の形式の信号パラメーターを受け入れます。
pkill -INT process-name
BSDライクなディストロやその他のディストリビューションでは、/ etc/rc.d /にスクリプトがあり、通常、システム内のデーモンの起動、再起動、停止を管理します。デーモンを停止するには、絶対パスでスクリプトを呼び出すか、例:
# /etc/rc.d/acpid stop
または次のコマンドを使用します。
# rc.d stop acpid
システムのデーモンの開始と停止を示すために、次のスクリプトを試すことを強くお勧めします。
#!/bin/bash
chk_status(){
target=$1
if [[ $target != "functions" && $target != "functions.d" ]]
then
if [[ -f "/var/run/daemons/$target" ]]
then
stat="\e[1;32m[RUNNING]"
else
stat="\e[1;31m[STOPPED]"
fi
printf "$stat \t\e[1;34m$target\e[0;0m\n"
fi
}
daemons=($(for daemon in /etc/rc.d/*; do echo "${daemon#\/etc\/rc.d\/}"; done))
if [[ $1 != "" ]]
then
chk_status $1
else
for d in "${daemons[@]}"; do
chk_status $d
done | sort
fi
killproc
関数が/etc/init.d/functions
スクリプト、ファイルを入手して関数を使用します。または、pgrep
およびpkill
ユーティリティを使用して、それらが意図したとおりに機能しているかどうかを確認してから使用します。例:pkill -SIGTERM mysqld
は、強制終了する前に、mysqldに安全なシャットダウンを実行させ、データベースをディスクにフラッシュさせるTERM killシグナルを送信します。