쉘이나 프로세스가 실행 중인 xterm을 식별하는 방법은 무엇입니까?

쉘이나 프로세스가 실행 중인 xterm을 식별하는 방법은 무엇입니까?

저는 일반적으로 여러 가상 데스크탑과 많은 xterm이 포함된 장기 실행 X 세션을 사용합니다.

또한 셸(zsh)에서 작업 제어를 사용하고 있습니다.

때로는 간단한 명령을 사용하여 xterm이 실행 중인(또는 정지된) 쉘이나 프로세스를 식별할 수 있기를 원합니다.

예를 들어 vim을 사용하여 파일을 편집하면 vim은 아직 실행 중인 다른 vim 인스턴스에서 파일이 이미 열려 있다는 경고를 표시합니다. 그러나 이제 프로세스 ID가 XYZ인 vim이 시작되고 일시 중지된 xterm을 잊어버렸습니다. 정지되었기 때문에 죽이는 것은 효과가 없습니다. 신호를 통해 복원한 다음 종료하면 작동하지만 포그라운드에서 실행 중인 프로세스가 엉망이 될 수 있으며 여러 창이 설정되어 있으므로 vim 인스턴스를 종료하고 싶지 않을 수도 있습니다.

현재 나는 awesomewm을 사용하고 있지만 다른 wms에 대한 솔루션에도 관심이 있습니다.

답변1

Xterm은 WINDOWID자식 프로세스의 환경에 변수를 넣습니다. 그 값은 xterm 창의 창 ID입니다. PID를 기반으로 프로세스 환경을 쿼리하는 POSIX 방법은 없습니다. 프로세스 환경을 쿼리 $pid하고 WINDOWID변수를 추출하는 Linux 방법은 다음과 같습니다.

</proc/$pid/environ gawk -v 'RS=\0' -F = '$1=="WINDOWID" {print $2}'

wmctrl그런 다음 창 관리자 인터페이스를 사용하여 창을 찾거나 작동할 수 있습니다.

screen을 사용하는 경우 먼저 STYscreen 세션의 이름으로 설정된 이 변수를 사용해 보세요. 를 사용하여 세션에 연결할 수 있습니다 screen -rd -S "$sessionname".

답변2

이를 사용하여 ps -o ppid= PID프로세스 PID의 상위 ID를 얻을 수 있습니다. 이는 아마도 프로세스를 시작한 쉘일 것입니다. 쉘의 상위 ID는 포함 터미널이 됩니다.


테스트를 위해 한동안 지속되는 프로세스를 생성했습니다.

$ sleep 5m &
[1] 31177

그런 다음 프로세스 31177의 상위 프로세스와 명령이 무엇인지 조회했습니다.

$ ps -o ppid= 31177
31107
$ ps -o cmd= 31107
zsh

31107은 내가 실행 중인 zsh 프로세스입니다 sleep 5m. 나는 zsh그 과정에서 이것을 반복했다.

$ ps -o ppid= 31107
31097
$ ps -o cmd= 31097
xterm

31097은 xtermzsh쉘이 실행되는 곳입니다.


원하는 상위 항목이 얼마나 떨어져 있는지 확실하지 않은 경우 이를 사용하여 지정된 명령 이름으로 상위 항목을 검색할 수 있습니다.

pid="$1"
cmd="$2"

seek=""
while [ "$seek" != "$cmd" ]; do
    # ps -o ppid= $pid
    pid=`ps -o ppid= $pid`
    seek=`ps -o cmd= $pid`

    if [ ${pid/ /} = 1 ]; then
        echo Reached the top of the tree
        exit 1
    fi
done

echo $pid

시험:

$ /tmp/find-parent 31177 xterm
31097

관련 정보