名前でデーモンをエレガントに殺す方法は?

名前でデーモンをエレガントに殺す方法は?

私は通常プロセスを殺しますkillall

killall markdoc

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

答え1

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

デーモンがこれを停止する具体的な方法があります。たとえば、Debian では次のようになります。

    service daemon-name stop

または

    /etc/init.d/daemon-name stop

他のディストリビューション/オペレーティングシステムで使用される他のinitscript標準にも同様の構文があります。

デーモン以外のプロセスを終了するには何らかの方法で制御できないと仮定し、基本的に(15)シグナルを使用するのと同じようにkillall安全に使用できます。 。やめる。同じ名前のプロセスが複数ある場合、これらのユーティリティは複数のプロセスを終了できることを検討してください。pkillSIGTERM

SIGINTそれでも問題が解決しない場合は、(2)、SIGHUP(1)、最後にSIGKILL(9)を試してください。アプリケーションは最後の信号をキャプチャできないため、クリーンアップを実行できません。したがって、このような状況はできるだけ避けるべきです。

pkill両方とも、次のようなkillall形式の信号引数を受け入れます。-NAME

pkill -INT process-name

答え2

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

killprocスクリプトに利用可能な関数があることを確認し、ファイルを受け取り、その/etc/init.d/functions関数を使用してください。または、pgrepユーティリティpkillを使用して期待どおりに機能していることを確認してから使用してください。例: pkill -SIGTERM mysqldシャットダウン前にTERM Killシグナルが送信され、mysqldが安全なシャットダウンを実行し、データベースをディスクにフラッシュするようにします。

関連情報