이름으로 데몬을 우아하게 죽이는 방법은 무엇입니까?

이름으로 데몬을 우아하게 죽이는 방법은 무엇입니까?

나는 보통 프로세스를 죽인다 killall.

killall markdoc

하지만 이 명령이 프로세스를 정상적으로 종료할지는 확실하지 않습니다. 명령이 정상적으로 종료됩니까? 그렇지 않다면 어떻게 프로세스와 그 이름을 정상적으로 종료할 수 있습니까?

답변1

귀하의 질문이 불분명합니다. 제목에서는 데몬 프로세스에 대해 이야기하지만 텍스트에서는 일반적인 프로세스에 대해서만 이야기합니다.

데몬이 이를 중지하는 구체적인 방법이 있습니다. 예를 들어 데비안에서는 다음과 같습니다.

    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, 파일을 받아 해당 함수를 사용하세요. 또는 pgreppkill유틸리티를 사용하여 예상대로 작동하는지 확인한 다음 사용하십시오. 예: pkill -SIGTERM mysqld종료되기 전에 TERM Kill 신호가 전송되어 mysqld가 안전한 종료를 수행하고 데이터베이스를 디스크에 플러시하도록 합니다.

관련 정보