특정 프로그램을 실행하는 프로그램을 찾는 방법은 무엇입니까?

특정 프로그램을 실행하는 프로그램을 찾는 방법은 무엇입니까?

어떤 프로그램이 내 스크립트를 실행하고 있는지 알아내는 방법이 있나요?

나는 창 관리자로 I3을 실행하고 있으며 i3config 대신 bynd 키를 사용하고 싶지만 sxkhd뭔가 내 sxkhd bynd를 계속 대체하므로 그것이 무엇인지 추적하고 싶습니다. 어쩌면 사용할 수도 있지만 strace방법을 찾지 못했습니다.

답변 감사합니다

편집:
이전 프로세스를 종료하지 않았으므로 sxkhd스크립트 실행에 대해 유죄가 인정되었지만
이러한 실행을 어떻게 추적할 수 있는지 여전히 궁금합니다.

답변1

$PPIDLinux에서는 변수 또는 /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에 추가됩니다. 명령줄에서 시작하면 쉘의 PID가 됩니다(예: /bin/bash).

답변2

셸에서 Linux의 경우:

readlink "/proc/$PPID/exe"

모든 표준 셸에서 $PPID변수는 상위 프로세스를 나타냅니다. C에서는 getppid(). 대부분의 언어에는 이를 검색하는 방법이 있습니다(예: getppidPerl, os.getppidPython 등).

상위 프로세스의 PID를 얻은 후에는 이를 실행 파일에 매핑하는 것이 시스템에 따라 달라집니다. ps프로세스 이름이나 명령줄 인수가 표시되지만 이는신뢰할 수 없다, 이는 (일반적으로) 전체 경로를 포함하지 않으며 프로세스 자체 또는 동일한 사용자로 실행되는 다른 프로세스에 의해 수정될 수 있기 때문입니다.

Linux에서는 프로세스의 실행 파일이 /proc/<pid>/exe. 이는 "마법의" 심볼릭 링크입니다. 원래 실행 파일이 제거되거나 이름이 바뀌더라도 여전히 이를 읽거나(예: 다른 곳에 복사하기 위해) 다시 실행할 수 있습니다.

관련 정보