내 컴퓨터에 Ubuntu가 있고 그 위에 멋진 창 관리자를 실행하고 있습니다. 실행중인 터미널을 어떻게 확인합니까? 명령이 있습니까?
내 컴퓨터에 Ubuntu가 있고 그 위에 멋진 창 관리자를 실행하고 있습니다. 실행중인 터미널을 어떻게 확인합니까? 명령이 있습니까?
답변:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. pid
나중에 값 을 ps -p <pid> -o args
명령에 전달할 수 있습니다 .기술적으로 터미널 에뮬레이터의 경우 주석에 명시된 바와 같이 명령이 필요하지 않습니다 .
무엇을 의미합니까? 도움말-> 정보를 클릭하십시오. – JoKeR
우리가 명확히해야 할 첫 번째 것은 정확히 묻는 것입니다-실행중인 쉘 또는 실행중인 터미널을 찾으십시오. 이 두 용어는 종종 같은 의미로 사용되지만 완전히 다른 것입니다. 쉘은 명령 행 인터프리터이며, 특히 대화식 쉘은 명령을 입력하는 프롬프트와 텍스트 필드입니다. 셸은 비대화 형일 수도 있습니다. 예를 들어 스크립트는 비대화 형 셸 bash -c 'echo hello world'
을 시작 하거나 비대화 형 셸 을 시작합니다.
대조적으로, 터미널은 쉘에 대한 인터페이스입니다 (하지만 다른 응용 프로그램 일 수도 있음). 원래 터미널은 실제 하드웨어를 언급했지만 오늘날은 대부분 소프트웨어입니다. GUI에서 Ctrl+ Alt+ 를 누르 t거나 터미널 아이콘을 클릭하면 하드웨어 동작을 모방하는 창인 터미널 에뮬레이터를 시작하고 그 창에서 셸이 실행되는 것을 볼 수 있습니다. Ctrl+ Alt+ F2(또는 6 개의 기능 키 중 하나)는 가상 콘솔 (일명)을 엽니 다 tty
. 가상 터미널이 왜 "가상"이고 "실제"터미널이 무엇 / 왜 / 어디에 있습니까?를 읽는 것이 좋습니다 . 자세한 내용은.
각 사용자는 /etc/passwd
자신의 사용자 이름으로 지정된 기본 쉘을 가지고 있습니다 . 기본 구성을 사용하고 있고 명령으로 다른 쉘을 명시 적으로 호출하지 않았다고 가정하면 충분합니다.
echo $SHELL
그러나 물론 이것은 기본값 만 보여줍니다 . 다음을 수행한다고 가정하십시오.
user@ubuntu:~$ dash
$
우리는 처음에 있었다 bash
, 그러나의 대화 형 세션을 시작 /bin/dash
, 우분투의 POSIX 또는 시스템 쉘을 . 변수 $SHELL
는 목적이 아니기 때문에 변경되지 않습니다. 기본 값은 현재 값이 아닙니다. 우리는 또 다른 관점, 즉 프로세스 관점의 관점에서 접근해야 할 것입니다. 프로세스 관점은 bash 또는 sh를 사용하고 있습니까?
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
여기서 우리는 /proc/
파일 시스템을 이용합니다. 프로세스 이름과 명령 줄 매개 변수가에 표시됩니다 /proc/<pid>/comm
. 쉘 PID를 제공하기 만하면 $$
됩니다. 위의 예에서 나는 그것을 별도로 추가하고 있지만, 우리가 그냥하지 못하게하는 것은 없습니다.
cat /proc/$$/comm
주제에 대한 변형도
ps -p $$ -o args
우리가 접근 할 수있는 또 다른 방법은 where를 확인하는 것 /proc/<pid>/exe
입니다. 이 파일은 실행 파일을 가리키는 심볼릭 링크입니다. 따라서 우리는 할 수 있습니다
user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1255/exe -> /bin/dash
두 가지 방법 중 하나가 99 %의 경우에 효과적입니다. 물론, 그것들은 파괴 될 수있는 방법이 있습니다. 예를 들어, 심볼릭 링크는 실행 파일이 쉘이 시작된 직후 삭제 (그 경우 당신은 아마 발생합니다 시스템 문제를 제거하기 때문에 경우 아무 곳이나하지 /bin/sh
, /bin/dash
짝수 또는 /bin/bash
권장하지 않습니다 - 모든 후 스크립트의 많은 그들에 의존 특히 시스템 수준의 시스템). 쉘의 명령 이름은 일반적으로 execve()
syscall 에서 첫 번째 인수로 설정됩니다 . 이것은 bash가 어떻게 호출되는지 어떻게 알 수 있습니까? 에서 다룹니다 . 을 통해 셸을 시작하는 응용 프로그램이 있으면 이름을 지정할 수 있습니다 execve()
. 그러나 이것들은 비표준적이고 비 전형적인 것이므로 일관성과 보안을 위해 피해야합니다.
환경 변수로 시작할 수 있습니다. 많은 터미널이 자체적으로 xterm
호환되는 것으로 보이며 echo $TERM
또는 로보고됩니다 echo $COLORTERM
. 그러나 환경 변수는 신뢰할 수있는 도구가 아닙니다. 그들은 설정 및 설정 해제 할 수 있습니다. 우리는 PID로 동일한 작업을 다시 할 수 있습니다. 이번에는 부모 PID를 볼 것입니다. 아시다시피, terminal은 쉘에 대한 인터페이스이며 종종 쉘 자체를 시작합니다. 따라서 쉘의 부모 프로세스가 어떤 프로세스인지 확인할 수 있습니다.
$ ps -p $$ -o args,ppid
COMMAND PPID
bash 1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server
다른 터미널 앱을 사용해 봅시다 sakura
:
$ ps -p $$ -o args,ppid
COMMAND PPID
/bin/bash 16950
$ ps -p 16950 -o args
COMMAND
sakura
거기에서 우리는 이미이 쉘이 시작된 것을 볼 수 있습니다 gnome-terminal
. 이 방법은 물론 대화식 쉘을 사용한다고 가정합니다. 예를 들어을 bash -c '...'
통해 시작된 부모 또는 셸 을 찾으려면 ssh
PID는 비 터미널 응용 프로그램에서 비롯되거나 GUI가 아닌 것일 수 있습니다.
따라서 GUI 터미널을 구체적으로 다루려면 run을 실행 xprop
하고 원하는 창을 클릭하고 pid를 grep 한 다음 pid와 일치하는 프로세스의 이름을 찾으십시오. 또는 다른 말로하면 :
$ ps aux | grep $(xprop | awk -F'=' '/PID/ {print $2}')
xieerqi 2124 0.6 1.7 208068 34604 ? Sl 18:47 1:49 gnome-terminal
또한 사양에 따라 창 관리자는 WM_CLASS
속성 을 설정해야 합니다. 따라서 우리는 다음을 얻을 수 xprop
있습니다.
$ xprop WM_CLASS
WM_CLASS(STRING) = "sakura", "Sakura"
물론 이것은 단점의 1 %도 있습니다. WM_CLASS
속성 설정 은이를 수행하는 창 관리자에 의존하며 PID는 창이 정확하다는 보장은 없습니다 ( 이 X11 창을 만든 프로세스 는 무엇입니까? 참조 ). 복잡한 디버깅이 필요할 수 있습니다. 그리고 이것들은 방법 자체의 단점이 아니라 X11 서버의 단점입니다. 그러나 가장 안정적이고 잘 알려진 창 관리자 (예 : openbox, Metacity, blackbox)와 대부분의 응용 프로그램은 잘 작동하므로 Gnome Terminal 또는 Terminator와 같은 문제는 예상하지 마십시오.
그러나 GUI 터미널 에뮬레이터에 관해서는 명령을 찾을 필요조차 없습니다. About
창 자체 의 대화 상자를 사용할 수 있습니다 . 해당 규칙의 예외는 xterm
입니다.
$SHELL
, 확실히
ps | grep
합니까? ps -p $$
! 또는 명령에 대해서만 ps -p $$ -o cmd=
.
ps | grep
나쁜 형태입니다. grep 할 수있는 것의 대부분은 실제로 ps
또는 다른 도구 로 얻을 수 있습니다.
짧은 버전 (thx @Serg )
cat /etc/alternatives/x-terminal-emulator
긴 버전
sudo update-alternatives --config x-terminal-emulator
*
출력에서를 찾으십시오.
;)
출력 예
There are 7 alternatives which provide `x-terminal-emulator’.
선택 대안 ——————————————— 1 / usr / bin / xterm 2 / usr / bin / uxterm 3 / usr / bin / koi8rxterm 4 / usr / bin / lxterm * + 5 /usr/bin/gnome-terminal.wrapper 6 / usr / bin / konsole 7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:
또는 @muru 덕분에 여기에 자세한 출력이 있습니다.
$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
또는 update-alternatives: error: unknown argument
-config'`
--config
sudo
. 사용update-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
의 경우이 심볼릭 링크의 대상을 대신 사용 cat
하는 것이 좋습니다. 이 file
유틸리티는 대부분의 시스템에 설치해야하며 대상 실행 파일을 찾는 데 사용할 수 있습니다. cat
심볼릭 링크 에서이 링크의 대상에 따라 쉘 스크립트 또는 바이너리 파일을 인쇄 할 수 있습니다 (쉘 스크립트 gnome-terminal
, 바이너리 파일 urxvt
등).
사용중인 터미널 프로그램을 알고 싶다면 다음을 사용하십시오.
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
쉘 인스턴스를 더 이상 포크하지 않고 터미널 (쉘) 을 연 직후에이를 실행하십시오 .
터미널 프로그램을 열면 기본적으로 자식 프로그램 인 쉘이 생성됩니다. 생성 된 쉘의 부모는 터미널 자체입니다. 즉, 쉘의 PPID는 터미널 프로그램의 PID입니다.
여기서는 쉘 프로그램 ( bash
) 의 상위 프로세스 ID (PPID)를로 ( ps -o 'ppid=' -p $$
터미널 프로그램의 프로세스 ID ) 찾습니다 .
그런 다음 PID에서 프로세스 이름을 찾습니다.
$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal
기본적으로 하나의 라이너입니다.
$ ps -o 'ppid=' -p $$
2268
$ ps -o 'cmd=' -p 2268
gnome-terminal
sshd: username@pts/4
. 참고 PuTTY를 사용하여 컴퓨터에 연결하고 있습니다. 가 sshd
실제로 터미널 에뮬레이터?
printenv
열린 세션의 모든 변수를 보려면 터미널 창에서 입력 하십시오.
echo $COLORTERM
터미널 창에서 입력 하십시오. 참고 : 이것은 모든 터미널에서 작동 sakura
하지는 않습니다.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
아래는 aterm
터미널 에서 나온 것 입니다.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
간단한 대답. 콘솔 또는 ssh 모두에서 작동합니다.
간단한 문자 터미널의 예 :
ssh username@systemname
echo $TERM
dumb
해당 연결에서 GUI 앱을 열 수 없음을 알려줍니다
xterm의 예 (Windows의 PuTTY / Xming에서도 작동)
ssh -Y username@systemname -- omit this if using PuTTY --
echo $TERM
xterm
리프 패드 편집기 또는 노틸러스 파일 관리자 열기와 같은 GUI 명령을 사용할 수 있습니다.
콘솔에서 동일합니다 :
Open terminal window
echo $TERM
xterm
TERM
기본 터미널 에뮬레이터를 정의하는 변수가 아니라 현재 터미널 에뮬레이터의 기능을 정의하는 변수입니다. 예를 들어, 변수를 "xterm-color"로 설정하면 터미널에서 실행중인 모든 프로그램은 현재 터미널이 색상을 이해해야한다는 것을 알 수 있습니다. "linux"로 설정하면 프로그램이 VT로되어 있다고 알려줍니다. etc.