pkill이 기다리고 있습니다

pkill이 기다리고 있습니다

다음을 수행할 수 있는 pkill과 같은 도구가 있습니까?

  1. 일치하는 모든 프로세스에 신호 보내기
  2. 프로세스가 종료될 때까지 N초 동안 기다립니다.
  3. 모든 프로세스가 종료되면 좋습니다. 종료합니다.
  4. 일부 프로세스가 종료되지 않은 경우 SIGKILL을 보냅니다.

프로세스가 실제로 종료될 때까지 도구가 기다리는 것이 중요합니다.

내가 가장 좋아하는 스크립팅 언어로 이 작업을 수행하는 것이 매우 쉽다는 것을 알고 있지만 이 경우 이미 존재하는 도구를 사용하는 것이 좋을 것입니다.

이를 위해서는 SuSE-Linux 및 Ubuntu에서 실행해야 합니다.

답변1

원하는 동작을 제공하는 "표준" 명령은 없습니다. 그러나 데비안과 그 파생물에서는 다음을 사용할 수 있습니다.start-stop-daemon작업 --stop--retry옵션:

start-stop-daemon --stop --oknodo --retry 15 -n daemontokill

SIGTERM명명된 모든 프로세스로 전송되어 daemontokill중지될 때까지 최대 15초를 기다린 다음 SIGKILL(초기 선택부터) 나머지 모든 프로세스로 전송되고 완료될 때까지 추가로 15초를 기다립니다. 종료할 항목이 없거나 모든 프로세스가 중지되면 상태 0으로 종료됩니다. 두 번째 시간 초과 후에도 일부 프로세스가 여전히 살아 있으면 상태 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, libtool, gettext. 빌드가 완료되면 디렉토리 start-stop-daemon에서 찾을 수 있습니다.utils

답변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 신호가 성공하면 제공된 명령은 기다리지 않지만 시스템에 의해 프로세스가 종료되므로 작동해야 합니다.

관련 정보