따라서 서버에서 백그라운드 작업(resque)을 실행하는 일부 프로세스가 있고 이러한 작업 중 일부는 가끔 멈추는 하위 프로세스를 시작합니다. 해당 자식 프로세스를 죽이면 모든 것이 정상으로 돌아간다는 것을 알았습니다. 너무 오랫동안 실행되는 경우 바이너리 프로세스를 종료하는 또 다른 스크립트가 있지만 여기서는 작동하지 않는 것 같습니다. 일반적으로 다음과 같이 할 수 있습니다.
killall --older-than 20m <process>
그런데 이 노동자들은 좀 까다로운 것 같아요. PS에서는 다음과 같이 표시됩니다.
jbsmith@server:~$ ps aux | grep resque
www-data 17652 0.0 1.8 794148 145940 ? Sl 11:03 0:05 resque-1.26.0: Processing email since 1494525823 [Email]
www-data 1026 0.0 1.9 787712 157080 ? Sl 10:47 0:13 resque-1.26.0: Forked 17652 at 1494525823
"Forked x at x"는 자식 프로세스이자 내가 종료해야 하는 프로세스입니다. "Forked"와 일치하고 20분 이상 지난 프로세스를 찾아서 종료하는 데 사용할 수 있는 한 줄 명령이 있습니까?
답변1
"한 줄", 스크롤을 줄이기 위해 두 줄로 나눕니다.
ps aux | awk -v cutoff=$(( $(date +%s) - 20 * 60 )) \
'/resque.*Forked [0-9]+ at [0-9]+/ { if ($NF < cutoff) system("kill " $2) }'
출력 지정자를 사용하여 ps
출력을 PID, COMM 및 ARG 필드로만 제한한 다음 구체적으로 COMM 및 ARGS와 일치시킴으로써 더 엄격하게 만들 수 있지만 여기서는 거짓 긍정 일치의 위험이 낮은 것 같습니다.