pkillが待っています

pkillが待っています

次のことができるpkillのようなツールはありますか?

  1. 一致するすべてのプロセスにシグナルを送信する
  2. プロセスが終了するまでN秒間待ちます。
  3. すべてのプロセスが終了したら良いです。終了します。
  4. 一部のプロセスが終了していない場合は、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ソフトウェアパッケージの一部であるため、dpkgDebianシステム(およびその派生システム)で常に使用できます。一部の非.debディストリビューションもこのパッケージを提供しています。オープンシューター跳躍42そこに。他のプラットフォームで構築するのは非常に簡単です。

git clone https://salsa.debian.org/dpkg-team/dpkg.git 
cd dpkg
autoreconf -fi && ./configure && make

あなたはautoconf、、、、。automake​ビルドが完了したら、ディレクトリにあります。libtoolgettextstart-stop-daemonutils

答え2

timeout次のコマンドを使用できます。killall -w

たとえば、

# timeout 3 killall -vws2 $PROCESS_NAME || killall -vws9 $PROCESS_NAME

timeout3秒後に「タイムアウト」し、エラーコードで終了します。その後、エラーコードをキャッチし||て実行して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信号が成功すると、提供されたコマンドは待機しませんが、システムによってプロセスが終了するため、機能する必要があります。

関連情報