次のことができるpkillのようなツールはありますか?
- 一致するすべてのプロセスにシグナルを送信する
- プロセスが終了するまでN秒間待ちます。
- すべてのプロセスが終了したら良いです。終了します。
- 一部のプロセスが終了していない場合は、SIGKILLを送信します。
プロセスが実際に終了するまでツールが待つことが重要です。
私が好きなスクリプト言語でこれを行うのはとても簡単ですが、この場合はすでに存在するツールを使用することをお勧めします。
これを行うには、SuSE-LinuxとUbuntuで実行する必要があります。
答え1
必要な動作を提供する「標準」コマンドはありません。しかし、Debian とその派生物では、次のものを使用できます。start-stop-daemon
タスク--stop
と--retry
オプション:
start-stop-daemon --stop --oknodo --retry 15 -n daemontokill
SIGTERM
指定されたすべてのプロセスに送信され、停止するdaemontokill
まで最大15秒を待ってからSIGKILL
(最初の選択から)、残りのすべてのプロセスに送信され、完了するまでさらに15秒を待ちます。終了する項目がない場合、またはすべてのプロセスが停止すると、ステータス0で終了します。 2 番目のタイムアウト後も、一部のプロセスがまだ生きている場合は、状態 2 で終了します。
さまざまな方法でプロセスを一致させるオプションがたくさんあります。詳細については、ドキュメント(上記にリンクされています)を参照してください。さまざまなタイムアウトを使用してより詳細なスケジュールを提供することもできます。
start-stop-daemon
ソフトウェアパッケージの一部であるため、dpkg
Debianシステム(およびその派生システム)で常に使用できます。一部の非.deb
ディストリビューションもこのパッケージを提供しています。オープンシューター跳躍42そこに。他のプラットフォームで構築するのは非常に簡単です。
git clone https://salsa.debian.org/dpkg-team/dpkg.git
cd dpkg
autoreconf -fi && ./configure && make
あなたはautoconf
、、、、。automake
ビルドが完了したら、ディレクトリにあります。libtool
gettext
start-stop-daemon
utils
答え2
timeout
次のコマンドを使用できます。killall -w
たとえば、
# timeout 3 killall -vws2 $PROCESS_NAME || killall -vws9 $PROCESS_NAME
timeout
3秒後に「タイムアウト」し、エラーコードで終了します。その後、エラーコードをキャッチし||
て実行してkillall -s9
強制終了します。
答え3
状況に応じてスクリプトを直接作成できます。この記事に従ってくださいkill -9の無駄な使用とソース本当に殺す
#!/bin/sh
#
# $Id: reallykill,v 1.2 2004/10/11 09:36:48 jmates Exp $
#
# The author disclaims all copyrights and releases this script into the
# public domain.
#
# Kills the specified processes by starting with the TERM signal and
# only if necessary working up to the violent KILL signal. For more
# information, see:
#
# http://sial.org/howto/shell/kill-9/
if [ -z "$1" ]; then
echo "usage: `basename $0` pid [pid ..]" >&2
exit 100
fi
cycle_kill () {
PID=$1
RETVAL=0
for signal in "TERM" "INT" "HUP" "KILL"; do
kill -$signal $PID
RETVAL=$?
[ $RETVAL -eq 0 ] && break
echo "warning: kill failed: pid=$PID, signal=$signal" >&2
sleep 1
done
return $RETVAL
}
for pid in "$@"; do
cycle_kill $pid
done
したがって、スクリプトをbinディレクトリにダウンロードするだけです。
curl http://web.archive.org/web/20080213192428if_/http://sial.org:80/howto/shell/kill-9/reallykill > $HOME/bin/killwait && chmod +x $HOME/bin/killwait
私はこれを次のように使用します:
ping -q localhost &
killwait `pidof ping`
ping コマンドの要約とともに出力を取得できるように、まず INT 信号の順序を変更したい場合があります。 KILL信号が成功すると、提供されたコマンドは待機しませんが、システムによってプロセスが終了するため、機能する必要があります。