..png)
어떤 이유로 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을 전달하십시오.