명령의 모든 프로세스를 종료합니다(첫 번째 프로세스 제외).

명령의 모든 프로세스를 종료합니다(첫 번째 프로세스 제외).

어떤 이유로 Cron에 저장된 스크립트/명령어가 여러 번 실행되고(첫 번째 인스턴스가 완전히 완료되지 않고 동일한 프로세스의 두 번째 인스턴스가 시작됨) 특정 시점이 되면 이러한 프로세스가 증가하는 상황이 가끔 발생합니다. 많고 쇼 시스템이 중단되는 등의 현상이 발생합니다. 그래서 제가 임시 해결책으로 원하는 것은 스크립트/명령의 인스턴스가 여러 개 있는지 확인하는 것입니다.

ps -ef | pgrep -f 'DELETE OPERATION_CONTEXT'

또는 이 명령의 모든 프로세스를 직접 종료합니다.

ps -ef | pkill -f 'DELETE OPERATION_CONTEXT'

하지만 pgrepped 명령을 사용하여 첫 번째 프로세스를 제외한 모든 프로세스를 종료하는 방법을 알고 싶습니다. 이렇게 하면 프로세스 중 하나가 계속 작동하고 다른 모든 중복 프로세스가 종료됩니다.

답변1

다음은 첫 번째 프로세스를 제외한 모든 PID를 종료하는 apache2 프로세스의 예입니다.

pgrep apache2 |awk 'NR >= 2' | xargs -n1  echo kill

위 명령의 출력이 양호하면 제거할 수 있습니다.echo

답변2

다음을 시도해 볼 수 있습니다.

ps -e --sort=start -o start,pid,cmd|grep <cmd>|egrep -v grep |sed 1d

그러면 다음과 같은 형식의 출력이 제공됩니다.

시작 시간, PID, 실행 중인 명령

for i in `ps -e --sort=start -o start,pid,cmd|grep <cmd>|egrep -v grep |sed 1d`
do
     kill -9 $i
done

먼저 kill을 echo로 대체하여 뉴스를 종료하는지 확인하세요.

답변3

예를 들어 다음과 같이 할 수 있습니다.

OLDEST_PID=$(pgrep -o 'DELETE OPERATION_CONTEXT')
test $OLDEST_PID && pgrep 'DELETE OPERATION_CONTEXT' | grep -vw $OLDEST_PID | xargs -r kill

첫 번째 줄은 가장 오래된 것을 찾습니다.PID. 두 번째 줄은 먼저 $OLDEST_PID무언가가 포함되어 있는지 확인합니다. 그렇다면 일치하는 모든 프로세스를 나열하고 필터링하여 $OLDEST_PID제거합니다.

더 나은 접근 방식은 다음을 추가하여 프로세스 중복을 피하는 것입니다.이 질문과 같이 cron 스크립트에 잠금 파일을 추가하십시오..

답변4

Java cron이 있고 해당 cron을 실행하기 전에 확인하려면 다음을 시도하십시오. System.out.println("이 cron의 이전 세션을 확인하십시오: "+cronname);

            String proname=ManagementFactory.getRuntimeMXBean().getName();
            String pid=proname.split("@")[0];
            System.out.println("Current PID:"+pid);

            Process proc = Runtime.getRuntime().exec(new String[]{"bash","-c"," ps aux | grep "+cronname+" | awk '{print $2}' "});

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String s = null;
            String killid="";

            while ((s = stdInput.readLine()) != null ) {                                        
                if(s.equals(pid)==false)
                {
                    killid=killid+s+" ";    
                }
            }
            System.out.println("Running PID'S except current:"+killid);

            proc.waitFor();             

            Process proc1 = Runtime.getRuntime().exec(new String[]{"bash","-c","kill -9 "+killid});
            proc1.waitFor();                

            System.out.println("Previous duplicate sessions closed for: "+cronname);        

cronname.jar로 cronname을 전달하십시오.

관련 정보