![이러한 특정 프로세스를 제외한 모든 프로세스 찾기](https://linux55.com/image/216366/%EC%9D%B4%EB%9F%AC%ED%95%9C%20%ED%8A%B9%EC%A0%95%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%A0%9C%EC%99%B8%ED%95%9C%20%EB%AA%A8%EB%93%A0%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%20%EC%B0%BE%EA%B8%B0.png)
보고 싶지 않은 일부 특정 프로세스를 제외하고 내 컴퓨터에서 실행 중인 모든 프로세스를 나열할 수 있는 ps
옵션 이나 표준 방법이 있습니까 ?pgrep
즉, 4개의 프로세스가 실행되고 있다고 가정해 보겠습니다.
% ps
PID TTY TIME CMD
26712 ttys000 0:00.45 -zsh
28228 ttys001 0:00.23 -zsh
42083 ttys002 0:00.11 -zsh
42396 ttys002 0:00.16 node
일부 프로세스 ID가 포함된 텍스트 파일이 있습니다.
% cat /tmp/no-interest.txty
26712
28228
표시되는 명령줄 호출을 원합니다.오직42083 및 42396에 대한 프로세스 정보입니다.
내가 해결하려는 보다 일반적인 문제는 특정 시점 이후에 시작된 프로세스를 표시하려는 것입니다. 현재 실행 중인 프로세스 목록을 텍스트 파일로 작성할 수 있지만 이 정보를 사용하여 보고 싶지 않은 프로세스를 숨기는 깔끔한 방법을 찾는 방법이 약간 혼란스럽습니다. 나는 다양한 언어로 된 짧은 프로그램으로 이 작업을 수행하는 방법을 알고 있지만 디버깅 중인 특정 컴퓨터에 해당 프로그램을 배치하는 것에 대해 걱정할 필요 없이 한 줄 프로그램으로 호출할 수 있는 것을 원합니다.
답변1
ps | grep -vFwf /tmp/no-interest.txty
ps
에서 단어로 구분된 행을 포함하는 행을 필터링합니다 /tmp/no-interest.txty
. 그러나 pid 필드뿐만 아니라 모든 곳에서 해당 항목을 찾습니다.
쉘이 zsh인 것처럼 보이므로 ps
pid 목록을 인수로 허용하면 zsh의 배열 빼기 연산자를 사용할 수도 있습니다.
to_exclude=( $(</tmp/no-interest.txty) )
all_pids=( $(ps -o pid=) )
ps -p ${all_pids:|to_exclude}
또는 익명 함수를 사용하십시오.
to_exclude=( $(</tmp/no-interest.txty) )
() { ps -p ${@:|to_exclude}; } $(ps -o pid=)
$(</tmp/no-interest.txty)
이 파일의 내용을 문자별로 분할합니다 $IFS
. 또한 ${(f)"$(</tmp/no-interest.txty)"}
파일에서 비어 있지 않은 모든 줄을 확인하세요.
그럼에도 불구하고, PID 번호는 결국 래핑되기 때문에 PID 번호에 의존하여 시작된 순서를 알 수는 없습니다.
일부 ps
구현의 경우 다음을 사용할 수 있습니다.
ps -o lstart
두 번째 정밀도로 프로세스 시작 시간을 가져옵니다( Tue Jan 31 06:05:22 2023
내 시스템에서는 로케일에 관계없이 ; ps
의 형식을 사용함 procps-ng
). C 로캘에 내장된 함수를 사용하여 zsh
구문 분석 할 수 있습니다.strftime
zmodload zsh/datetime
(( cutoff = EPOCHSECONDS - 2*60*60 )) # two hours ago
pids=()
ps -o pid= -o lstart= |
while read -r pid start; do
LC_ALL=C strftime -rs t '%a %b %d %H:%M:%S %Y' $start &&
(( t >= cutoff )) &&
pids+=( $pid )
done
(( $#pids )) && ps -p $pids
또한 프로세스는 프로세스(또는 상위 프로세스 중 하나)가 현재 실행 중인 명령을 호출하는 것과 동시에 시작될 필요는 없습니다. 프로세스는 수명 동안 여러 명령을 실행할 수 있고 종종 실행하기 때문입니다.
예를 들어 , , then , then(대화형 셸의 하위 프로세스로 시작되었을 수 있음)을 실행하는 sh -c 'sleep 2; exec env cmd'
동일한 프로세스에서 .sh
env
cmd
답변2
일단 기계에 올라타면 어떤 부팅이라도 볼 수 있기를 바랍니다.
아하하하! 따라서 수명이 너무 짧아 실행 중인 모든 프로세스의 단일 "스냅샷"을 통해 이를 가로챌 확률이 매우 낮은 것을 선호할 수도 있습니다.
따라서 어떤 프로세스가 실행되고 있는지 보지 마십시오.지금, 모든 프로세스의 로그는 어떻습니까?다음으로 시작됨로그인하셨나요?
bpftrace
(많은 시스템에 설치되어 있으며 기본적으로 모든 Linux 배포판에서 사용 가능)이 필요합니다 . 파일을 실행하여 프로세스를 시작하려는 모든 시도를 보여주는 멋진 스크립트는 다음과 같습니다.
#!/usr/bin/bpftrace
// Taken from https://unix.stackexchange.com/a/584857/106650
// by Rui F Roberto CC-BY-SA 4.0
// Modified to log exec syscalls by Marcus Müller
BEGIN {
printf("Tracing exec syscalls... Hit Ctrl-C to end.\n");
printf("%-9s %-6s %-16s %s\n", "TIME", "PPID", "COMM", "EVENT");
}
tracepoint:syscalls:sys_enter_exec*
{
time("%H:%M:%S ");
printf("%-6d %s: ", pid, comm);
join(args->argv);
}
예쁘지는 않지만 복사하여 붙여넣은 코드 줄은 항상 유용할 수 있습니다.
bpftrace -e 'tracepoint:syscalls:sys_enter_exec* { printf("%-6d %s: ", pid, comm); join(args->argv); }'
1 스펙트럼 분석기와 같은 분야의 용어 - 매우 짧은 시간 동안 대역에서 "팝"하는 신호로 때로는 사전에 알 수 없으며 대역을 순서대로 조정해야 하는 경우 신호를 "포착"하기가 어렵습니다. 신호를 보내고 각 스냅샷을 촬영합니다." 따라서 신호 감지기는 감지 시스템과 클래스 1 신호를 보고 "차단 확률은 0.1%에 불과합니다."라고 말합니다.
답변3
답변하려면 내 댓글을 전환하세요.
- 사용
ps' start
및awk
특정 시간 이후부터 하루가 끝날 때(자정)까지 모든 프로세스를 나열하려면 다음을 수행하십시오.
ps -eo pid,user,start,cmd | awk '$3>"17:40"'
특정 시간 이후부터 다음 날 끝까지(다음 날 자정)까지 모든 프로세스를 나열하려면 다음을 수행하십시오.
ps -eo pid,user,lstart,cmd | awk '$5>30 || $6>="17:40"'
#cons: will not work as you would like if the next day is the first day of next month.
- 사용
ps' pid
및awk
너무 똑똑하지는 않지만 :) 먼저 관심 있는 프로세스 시작 시간의 pid를 확인한 다음 awk
( 여기서 더 나은 sed
방법으로 awk
) 필터링할 수 있습니다.
특정 시간부터 마지막 프로세스까지 실행 중인 모든 프로세스를 나열합니다("특정 시간"과 마지막 프로세스 사이에 몇 시간/일이 있는지 관계 없음).
ps -eo pid,user,lstart,cmd | awk '$1>=7895'
빠른 설명:
start
andlstart
- 추가로bsdstart
,start_time
andstime
(마지막 두 개는 나에게 동일해 보입니다.lstart
가장 긴 시간 형식을 제공합니다.) -ps'
명령 시작 시간을 표시하기 위한 표준 형식 지정자입니다.'$3>"17:40"'
-field
3
초과가17:40
전체 라인(레코드)을 인쇄하는 경우 기본 동작은{print}
명시적으로 입력할 필요가 없도록 하는 것입니다.