창 관리자에서 시작된 응용 프로그램의 출력은 어디에 있습니까?


10

터미널에서 응용 프로그램을 시작하면 stdout 및 stderr에 대한 출력이 표시되지만 응용 프로그램이 창 관리자에서 시작된 경우 이러한 파일에 대한 출력은 일반적으로 어디로 이동합니까? / dev / null로?


1
제안 : ps faux프로세스와 관련된 tty / pt를 확인하는 데 사용 합니다. 아니면 "?" 아마도 공허에서 길을 잃을 것입니다. (이것은 단지 생각이다, 내가 틀릴 수있다)
mveroone

@ Kwaio : 값은 물음표 (?)이므로, 아마도 무효화 될 것입니다.
August Karlstrom

2
gdm 또는 kdm에서 그래픽 쉘을 시작한 경우 출력은~/.xsession-errors
Shadur

답변:


8

창 관리자에서 시작된 응용 프로그램의 출력은 창 관리자 자체의 출력과 같은 위치로 이동합니다. (응용 프로그램이 리디렉션하지 않는 한 일반적인 GUI 응용 프로그램은 그렇지 않습니다.)

파일 디스크립터 1 (표준 출력) 및 파일 디스크립터 2 (표준 오류)에서 열린 항목을보고 WM의 출력 위치를 찾을 수 있습니다. 일반적으로 둘 다 동일한 파일로 이동합니다. 창 관리자의 프로세스 ID 알아보십시오 (시도의 예를 pgrep metacitypidof metacity- 당신이 당신의 창 관리자의 프로세스 이름을 모르는 경우, 프로세스 나무의 하나의 루트에있는 모습이보고 Metacity이 창 관리자 인 경우 ps f또는 pstree). 창 관리자의 프로세스 ID가 1234라고 가정하고 실행하십시오.

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에서 사용되지 않는 일반적인 상황에서 터미널 에뮬레이터의 출력 위치를 쉽게 확인할 수 있습니다 터미널 에뮬레이터가 쉘의 상위 프로세스이므로 계속 진행됩니다. 터미널 에뮬레이터가 추가 권한으로 실행중인 경우 작동하지 않습니다. 일부 시스템에서는 터미널 에뮬레이터가 로그인 한 사용자 목록 (utmp)에 쓸 수 있습니다.

lsof -p$PPID
ls -l /proc/$PPID/fd

많은 배포판에서 X 세션의 출력을로 지정합니다 ~/.xsession-errors.


필자의 경우 WM에서 시작하는 자식 부모 계층 구조는 블랙 박스 <-lightdm <-lightdm <-init이며 모든 tty의 값은 "?"입니다. 그런 다음 출력이 아무데도 가지 않는다고 생각합니다.
August Karlstrom

@AugustKarlstrom 그런 다음 pidof blackbox또는 pgrep blackbox창 관리자의 PID를 가져 오거나 직접 lsof -p$(pidof blackbox). Ttys는 이것과 아무 관련이 없습니다.
Gilles 'SO- 악마 그만'

1
아 물론 이죠 이 명령 ls -l /proc/<blackbox-id>/fd은 stdout이 가고 /dev/nullstderr가 가고 있음을 알려줍니다 ~/.xsession-errors.
August Karlstrom

1

창 관리자는 X 서버의 자식이므로 해당 자식 및 자식 출력은 X 서버와 동일한 위치로 이동합니다.

유일한 사용자이고 그래픽으로 로그인하는 경우 일부 시스템은 X 서버 인스턴스를 출력 콘솔에서 대체하므로 해당 VT로 전환하여 볼 수 있습니다. 일화 적으로 배열은 일반적으로 alt-ctrl-f1X 인스턴스의 출력 콘솔이고 alt-ctrl-f7X 디스플레이이지만 배열은 가능한 한 많이 확인할 수 있습니다. 처음 6 개는 일반적으로 로그인을 생성하지만 비어 있거나 파이프 출력으로 표시되지 않거나 더 많이 표시 될 수 있습니다. init에서 출력 될 수도 있고 X에서의 출력과 혼동하지 마십시오. 내 경험에 따르면 X와 어린이는 항상 많은 양의 경고와 메시지 (글꼴 누락, 감가 상각 된 호출 등)를 짖습니다.

GUI를 통해 로그인하지 않으면 X를 시작한 VT가 될 것입니다. 종료하기 전까지는 볼 수 없기 때문에 문제가됩니다. GUI 로그인으로 XDM (그래픽 로그인)이 권한있는 프로세스로 실행되므로 출력을 파이프로 전달할 수 있습니다 /dev/tty7. startx 1>&2> /dev/tty7올바른 수퍼 유저 권한이있는 경우 에도 ( ) 할 수 있습니다.


1
필요한 경우 startx또는 xinit직접 ~/.xinitrc필요한 경우 exec원하는 창 관리자를 수행하기 전에 항상 필요에 따라 리디렉션을 조정할 수 있습니다 . 나는 이런 종류의 결과를 놓친 적이 없다. GUI 응용 프로그램이 생성하는 것에 관심이 있다면 터미널에서 실행합니다. 그러나 실제로 그것은 도움이 될 수 있으므로 stdout 및 stderr을 ~/.xinitrc로 리디렉션 했습니다 ~/.xinitrc.out.
Miroslav Koškár

0

당신은 일반적으로 그것을 가지고가는 경우에 하나 개의 프로그램이 일련의 작업을 수행하여 또 다른 시작 man 2 forkman 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.