어떤 프로그램이 내 스크립트를 실행하고 있는지 알아낼 수 있는 방법이 있나요?
나는 창 관리자로 I3를 실행하고 있고 i3config 대신 bynd 키를 사용하고 싶지만 sxkhd
뭔가가 내 sxkhd bynd를 계속 대체하므로 그것이 무엇인지 추적하고 싶습니다. 어쩌면 그것을 사용할 수도 있지만 strace
아직 방법을 찾지 못했습니다.
답변해 주셔서 감사합니다.
편집:
이전 프로세스를 종료하지 않았 sxkhd
으므로 이전 프로세스가 내 스크립트를 실행한 것으로 밝혀졌지만
여전히 이러한 실행을 추적하는 방법이 궁금합니다.
답변1
$PPID
Linux에서는 변수 또는 /proc/pid/status에서 상위 프로세스의 PID를 얻을 수 있습니다. 예를 들어 데몬의 경우 상위 프로세스가 항상 호출 프로세스인 것은 아니지만 일반적으로 그렇습니다. 즉, 각 프로그램을 상위 프로세스의 PID를 먼저 파일에 기록한 다음 원본 바이너리를 실행하는 래퍼로 변환할 수 있습니다. 저는 sxkhd를 사용하지 않지만 X11을 사용할 때 xeyes를 예로 들어보겠습니다. xeyes
다음 내용을 포함하는 스크립트를 생성 하고 실행 가능하게 만듭니다.
#!/usr/bin/env sh
printf "PPID: %d\n" "$PPID" >> /tmp/XEYES_RUN
xeyes.orig "$@"
이제 원본 xeyes 바이너리의 이름을 xeyes.orig로 바꿉니다.
sudo mv "$(command -v xeyes)" "$(dirname $(command -v xeyes))"/xeyes.orig
xeyes
원본을 스크립트 래퍼로 바꿉니다.
sudo cp ./xeyes "$(dirname $(command -v xeyes.orig))"
일반통화 xeyes
:
xeyes
이제 xeyes가 실행될 때마다 상위 프로세스의 PID가 /tmp/XEYES_RUN에 추가됩니다. 명령줄에서 시작하면 /bin/bash와 같은 셸의 PID가 됩니다.
답변2
Linux의 경우 셸에서 다음을 수행합니다.
readlink "/proc/$PPID/exe"
표준 셸에서 $PPID
변수는 상위 프로세스를 참조합니다. C에서는 를 사용할 수 있습니다 getppid()
. 대부분의 언어에는 이를 검색하는 방법이 있습니다(예: getppid
Perl, os.getppid
Python 등).
상위 프로세스의 PID가 있으면 이를 실행 파일에 매핑하는 것은 반드시 시스템에 따라 다릅니다. ps
프로세스 이름이나 명령줄 인수를 알려 주지만 이는신뢰할 수 없는, 이는 일반적으로 전체 경로를 포함하지 않으며 프로세스 자체 또는 동일한 사용자로 실행되는 다른 프로세스에 의해 수정될 수 있기 때문입니다.
Linux에서는 프로세스의 실행 파일이 /proc/<pid>/exe
. 이것은 "마법의" 심볼릭 링크입니다. 원본 실행 파일이 삭제되거나 이름이 바뀌더라도 여전히 읽거나(예: 다른 곳에 복사) 다시 실행할 수 있습니다.