私は通常プロセスを殺しますkillall
。
killall markdoc
ただし、このコマンドがプロセスを正常に終了するかどうかはわかりません。コマンドは正常に終了しますか?そうでなければ、どのようにプロセスとその名前を正常に終了できますか?
答え1
あなたの質問は不明です。タイトルではデーモンプロセスについて話しますが、テキストでは一般的なプロセスについてのみ話します。
デーモンがこれを停止する具体的な方法があります。たとえば、Debian では次のようになります。
service daemon-name stop
または
/etc/init.d/daemon-name stop
他のディストリビューション/オペレーティングシステムで使用される他のinitscript標準にも同様の構文があります。
デーモン以外のプロセスを終了するには何らかの方法で制御できないと仮定し、基本的に(15)シグナルを使用するのと同じようにkillall
安全に使用できます。 。やめる。同じ名前のプロセスが複数ある場合、これらのユーティリティは複数のプロセスを終了できることを検討してください。pkill
SIGTERM
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が安全なシャットダウンを実行し、データベースをディスクにフラッシュするようにします。