web-dev-qa-db-ja.com

その名前のデーモンを優雅に殺すには?

私は通常、killallを使用してプロセスを強制終了します。

killall markdoc

しかし、このコマンドでプロセスが正常に終了するかどうかはわかりません。このコマンドは正常に終了しますか?そうでない場合、どうすればその名前のプロセスを正常に終了できますか?

16
Eonil

あなたの質問は明確ではありません、あなたはタイトルでデーモンについて話しますが、本文では一般的なプロセスについてのみ話します。

デーモンには、それを停止するための特定の手段があります。たとえば、Debianでは

    service daemon-name stop

または

    /etc/init.d/daemon-name stop

他のディストリビューション/ OSで使用される他のinitscript標準にも同様の構文が存在します。

デーモン以外のプロセスを強制終了するには、それが何らかの形で制御不能であると想定して、killallまたはpkillをデフォルトで使用することを前提として、SIGTERM( 15)シグナル。きちんと作成されたアプリケーションは、このシグナルを受信したときにキャッチして正常に終了する必要があります。同じ名前のプロセスが多数ある場合、これらのユーティリティが複数のプロセスを強制終了する可能性があることを考慮してください。

それがうまくいかない場合は、SIGINT(2)、SIGHUP(1)、そして最後の手段としてSIGKILL(9)を試すことができます。この最後の信号はアプリケーションでキャッチできないため、クリーンアップを実行できません。このため、できる限り回避する必要があります。

pkillkillallはどちらも、-NAMEの形式の信号パラメーターを受け入れます。

pkill -INT process-name
19
enzotib

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
3
user13742

killproc関数が/etc/init.d/functionsスクリプト、ファイルを入手して関数を使用します。または、pgrepおよびpkillユーティリティを使用して、それらが意図したとおりに機能しているかどうかを確認してから使用します。例:pkill -SIGTERM mysqldは、強制終了する前に、mysqldに安全なシャットダウンを実行させ、データベースをディスクにフラッシュさせるTERM killシグナルを送信します。

0
Nikhil Mulley