저는 일반적으로 여러 가상 데스크탑과 많은 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을 사용하는 경우 먼저 STY
screen 세션의 이름으로 설정된 이 변수를 사용해 보세요. 를 사용하여 세션에 연결할 수 있습니다 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은 xterm
내 zsh
쉘이 실행되는 곳입니다.
원하는 상위 항목이 얼마나 떨어져 있는지 확실하지 않은 경우 이를 사용하여 지정된 명령 이름으로 상위 항목을 검색할 수 있습니다.
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