bash에서 실행되는 모든 프로세스를 추적하는 방법이 있습니까?

bash에서 실행되는 모든 프로세스를 추적하는 방법이 있습니까?

나는 bash를 통해 내가 가장 많이 실행하는 프로그램을 셀 수 있기를 원합니다. bash에 일종의 후크를 삽입하여 bash가 수행하는 모든 작업을 기록하는 방법이 있습니까?

단순히 bash 기록 파일을 보는 것만으로는 충분하지 않습니다. 기록의 각 줄에서 첫 번째 토큰을 인쇄할 수 있지만 파이프 및 프로세스 교체는 수행되지 않습니다. 나는 다음을 원합니다 :

$ ls /usr/bin/* | fgrep $(echo grep)

ls, fgrep, 및 실행을 각각 한 번씩 기록합니다 echo. 그리고 다음:

$ for file in /usr/bin/*; do stat $file; echo $file; done

주의를 기울이고 stat달려야 합니다 echo. Bash 흐름 제어 문 이므로 for기록되지 않습니다.

쉘 내장 기능과 함수를 기록해야 하는지 여부는 논쟁의 여지가 있습니다(아마도 해당 내용만). 위의 예에서는 하나 이상의 런 루프를 기록해야 하는지 stat여부 echo도 논란의 여지가 있습니다 . 하지만 가장 간단한 방법으로 출력을 처리할 수 있습니다.

Bash를 실행하면 프로세스에 연결 하고 진행 상황을 기록 -x하는 내부 메커니즘이 있음을 알 수 있습니다 . exec들어갈 수 있는 다른 방법은 없나요?

답변1

첫 번째로,

strace -e execve -b execve -f -qqv -e signal='!all' bash 

스모크 테스트를 사용하지 않는 경우 stderr를 일부 로거 파이프로 리디렉션하거나 strace의 파일을 사용하여 일부 엉터리 디렉토리를 버려야 합니다 -o.-o ~/commandtraces/$(date +%Y%m%d%H%M%S).$$

모든 대화형 쉘에 대해 이를 수행하려면 재귀를 방지하기 위한 가드 변수가 필요하다고 생각합니다 .bashrc.

답변2

로컬 시스템이고 매우 주의를 기울이면 모든 /usr/bin 파일을 래퍼로 바꿀 수 있습니다.
그것은 마치

cp -pr /usr/bin /usr/orgbin
cd /usr/bin
for f in *; do
   echo "/usr/orgbin/echo $f used >> /tmp/bin_usage.out" > $f
   chmod +x $f
done

먼저 무해한 프로그램 2개를 사용해 볼까요?

답변3

PROMPT_COMMAND후크를 사용하여 입력한 마지막 명령을 기록하는 내용을 삽입 할 수 있습니다 . 이 로그는 명령을 사용하여 생성할 수 있습니다 logger.

그것은 마치export PROMPT_COMMAND="logger `history 1`"

관련 정보