터미널에서 애플리케이션을 실행하면 stdout 및 stderr의 출력을 볼 수 있지만, 창 관리자에서 애플리케이션을 실행하면 이러한 파일의 출력은 일반적으로 어디로 가나요? /dev/null로?
답변1
창 관리자에서 시작된 응용 프로그램의 출력은 창 관리자 자체의 출력과 같은 위치에 있습니다. (애플리케이션이 리디렉션하지 않는 한 일반적인 GUI 애플리케이션은 리디렉션하지 않습니다.)
파일 설명자 1(표준 출력)과 파일 설명자 2(표준 오류)에 열려 있는 내용을 보면 WM의 출력이 어디로 가는지 알 수 있습니다. 일반적으로 둘 다 동일한 파일로 이동합니다. 창 관리자의 프로세스 ID를 알아보세요(예: pgrep metacity
Metacity가 창 관리자인지 확인해보세요. 창 관리자의 프로세스 이름을 모르는 경우 pidof metacity
프로세스 트리 중 하나의 루트를 보거나 보고하세요). 창 관리자의 프로세스 ID가 1234라고 가정하고 다음을 실행하십시오.ps f
pstree
lsof -p1234
파일 설명자 1과 2에 해당하는 줄을 찾거나
또는
ls -l /proc/1234/fd
관련 파일 설명자를 자동으로 필터링할 수 있습니다.
lsof -p1234 | awk '$4 ~ /^[12][^0-9]/'
ls -l /proc/1234/fd/[12]
(참고: 위의 모든 명령은 Linux에 적용됩니다. pgrep
다른 유닉스에서 일반적이며 lsof
거의 모든 곳에 설치할 수 있습니다. ps
옵션과 /proc
내용은 유닉스마다 다릅니다.)
일반적인 경우 터미널 에뮬레이터(xterm, konsole, gnome-terminal 등)에서 실행되는 셸에서 명령을 실행하지만 크로스 스크린이나 tmux를 사용할 때는 실행하지 않습니다. 그러면 터미널 에뮬레이터의 출력이 어디로 가는지 쉽게 확인할 수 있습니다. place , 터미널 에뮬레이터가 셸의 상위 프로세스이기 때문입니다. 터미널 에뮬레이터가 추가 권한으로 실행 중이면 이 방법이 작동하지 않습니다. 이는 일부 시스템에서 터미널 에뮬레이터가 로그인한 사용자 목록(utmp)에 쓸 수 있도록 허용하는 경우입니다.
lsof -p$PPID
ls -l /proc/$PPID/fd
많은 배포판은 X 세션의 출력을 ~/.xsession-errors
.
답변2
창 관리자는 X 서버의 자식이므로 그 자식의 출력은 X 서버와 같은 위치에 있습니다.
귀하가 유일한 사용자이고 그래픽으로 로그인한 경우 일부 시스템은 출력 콘솔에서 X 서버 인스턴스를 대체합니다.그 VT그리고 그것을 참조하십시오. 흥미롭게도 이 배열은 대개 alt-ctrl-f1
X 인스턴스의 출력 콘솔이며 X 모니터이기도 alt-ctrl-f7
하지만 원하는 만큼 확인할 수 있습니다. 처음 6개는 일반적으로 로그인을 생성하지만 로그인을 생성하지 않고 공백으로 표시되거나 파이프된 출력으로 표시되는 것이 더 있을 수 있습니다. 이들 중 일부는 init의 출력을 가질 수 있으므로 X의 출력과 혼동해서는 안 됩니다. 내 경험에 따르면 X와 아이들은 항상 많은 경고와 메시지(글꼴 누락, 더 이상 사용되지 않는 호출 등에 대한)를 발행합니다.
GUI를 통해 로그인하지 않으면 X를 시작한 VT가 무엇이든 될 것입니다. 이는 로그아웃하지 않으면 볼 수 없기 때문에 문제가 됩니다. GUI를 통해 로그인하는 경우 XDM(그래픽 로그인)은 권한 있는 프로세스로 실행됩니다. 즉, 올바른 수퍼유저 권한이 있으면 출력을 /dev/tty7
.startx 1>&2> /dev/tty7
답변3
생각해 보면 일반적으로 프로그램은 일련의 작업을 수행하여 다른 프로그램을 시작한 man 2 fork
다음 man 2 execve
해당 프로세스 중에 기본 파일 설명자가 열린 상태로 유지됩니다.
따라서 대답은 일반적으로 부모 프로세스 출력/오류가 분기 시점에 가리키는 곳에서 출력/오류가 발생한다는 것입니다(물론 부모가 일부 리디렉션을 수행하지 않는 한). 상위 프로그램이 무엇인지 정확히 알지 못하면 더 구체적인 것을 선언할 수 없을 것 같습니다. 창 관리자 프로세스는 다른 프로그램을 직접 시작하는 데 거의 관여하지 않습니다.
나를 예로 들어봐
- Ctrl+P(
xmonad
창 관리자에서 처리)를 누르면 실행됩니다.dmenu_run
dmenu_run
내 입력을 처리하고 일부 응용 프로그램을 시작합니다(예:xkill
)
출력은 /dev/tty1
다음 으로 이동합니다.
xkill
다음으로 시작됨dmenu_run
dmenu_run
다음으로 시작됨xmonad
xmonad
다음으로 시작됨X
X
다음으로 시작됨startx
startx
첫 번째 가상 콘솔에서 내가 수동으로 시작했습니다./dev/tty1
참고로, 출력/오류가 어디로 가는지 찾고 싶거나 특정 프로세스에 대해 열려 있는 파일 설명자(알려진 PID 포함)를 더 잘 알고 싶다면 다음을 수행하세요.
$ lsof -p PID