2016-06-03 1 views
0

지금 당장 bash 스크립트는 1 PID 프로세스에서 작동하며 정확한 프로세스 이름을 입력해야합니다. 그것은 *firefox*' for example. Also, I run a bash script that opens multiple rsync` 프로세스를 받아들이지 않을 것이고,이 스크립트가 모든 프로세스를 죽이게하고 싶습니다. 그러나이 스크립트는 PID가 1 개인 프로세스에서만 작동합니다.Bash 스크립트가 지정된 파일의 모든 PID를 죽이지 않거나 입력 부분 이름을 허용하지 않습니다.

#!/bin/bash 

    createProcfile() { 

    ps -eLf | grep -f process.tmp | grep -v 'grep' | awk '{print $2,$10}' | sort -u | egrep -o '[0-9]{4,}' > pid.tmp 

# pgrep "$(cat process.tmp)" > pid.tmp 

    } 

    PIDFile=pid.tmp 

    echo "Enter a process name" 
    read -r process 
    echo "$process" > process.tmp 

# node_process_id=$(pidof "$process") 
    node_process_id=$(ps -eLf | grep $process | grep -v 'grep' | awk '{print $2,$10}' | sort -u | egrep -o '[0-9]{4,}') 
    if [[ -z "$node_process_id" ]]; then 
      echo "Please enter a valid process." 
     rm process.tmp 
     exit 0 
    fi 

    ps -eLf | grep $process | awk '{print $2,$10}' | sort -u | grep -v 'grep' 
# pgrep "$(cat process.tmp)" 

    echo "Would you like to kill this process(es)? (y/n)" 
    read -r answer 

    if [[ "$answer" == y ]]; then 

     createProcfile 
     pkill -F "$PIDFile" 
     rm "$PIDFile" 
     sleep 1 
     createProcfile 

     node_process_id=$(pidof "$process") 
     if [[ -z $node_process_id ]]; then 
       echo "Process terminated successfully." 
      rm process.tmp 
      exit 0 
     else 
      echo "Process not terminated. Kill process manually." 
      ps -eLf | grep $process | awk '{print $2,$10}' | sort -u | grep -v 'grep' 
#   pgrep "$(cat process.tmp)" 
      rm "$PIDFile" 
      rm process.tmp 
      exit 0 
     fi 
    fi 

내가 스크립트 편집 : 여기

는 스크립트입니다. 귀하의 의견 덕분에, 지금 작동은 다음을

  1. 만들기 스크립트는
  2. 1 개 이상의 PID

감사합니다 죽여 입력으로 부분적인 이름을 그대로!

+0

단순히 'pkill'을 대신 사용하지 않는 이유는 무엇입니까? – iruvar

+0

예! @iruvar 감사합니다! 내가 당신에게 점수를 줄 수 있도록 질문에 대답하십시오. – Debug255

답변

0
It will not accept *firefox* 

killall 명령을 사용하십시오. 예 :

killall -r "process.*" 

이 이름이 어떤 물건 다음에 처음에 과정를 포함하는 모든 프로세스를 죽일 것이다.

[ manual ]

는 말한다 :

-r, --regexp
는 확장 된 정규 표현식으로 프로세스 이름 패턴을 해석합니다.

(!) 참고 : 우리가 인용 파일 대체 (globbing)을 방지하기 위해 정규 표현식을 두 배로해야

참고.
(감사합니다. @broslow).

+0

아직도 인용되거나 도망쳐 야합니다. – BroSlow

+0

나는 그것이 필요 없다고 믿었습니다. – sjsam

+1

'killall'은 현재 디렉토리에'process. * '와 일치하는 파일이 있다면'*'을 결코 보지 않을 것입니다. – BroSlow

0

pkill은 문제를 해결하기 위해 존재합니다. -f이 지정되면 프로세스 이름 또는 전체 명령 줄과 일치하는 패턴을 허용합니다.

+0

부분적인 이름을 받아 들일 필요가있는 스크립트 부분도 프로세스를 죽이지 않아야합니다. 그래서, 나는 그것을 사용할 수 없다. 나는 스크립트를 편집하여 내가 수정 한 것을 보여 주거나 '해결 방법'으로 사용합니다. – Debug255

관련 문제