터미널에서 응용 프로그램을 시작하면 stdout 및 stderr에 대한 출력이 표시되지만 응용 프로그램이 창 관리자에서 시작된 경우 이러한 파일에 대한 출력은 일반적으로 어디로 이동합니까? / dev / null로?
~/.xsession-errors
터미널에서 응용 프로그램을 시작하면 stdout 및 stderr에 대한 출력이 표시되지만 응용 프로그램이 창 관리자에서 시작된 경우 이러한 파일에 대한 출력은 일반적으로 어디로 이동합니까? / dev / null로?
~/.xsession-errors
답변:
창 관리자에서 시작된 응용 프로그램의 출력은 창 관리자 자체의 출력과 같은 위치로 이동합니다. (응용 프로그램이 리디렉션하지 않는 한 일반적인 GUI 응용 프로그램은 그렇지 않습니다.)
파일 디스크립터 1 (표준 출력) 및 파일 디스크립터 2 (표준 오류)에서 열린 항목을보고 WM의 출력 위치를 찾을 수 있습니다. 일반적으로 둘 다 동일한 파일로 이동합니다. 창 관리자의 프로세스 ID 알아보십시오 (시도의 예를 pgrep metacity
나 pidof 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
.
pidof blackbox
또는 pgrep blackbox
창 관리자의 PID를 가져 오거나 직접 lsof -p$(pidof blackbox)
. Ttys는 이것과 아무 관련이 없습니다.
ls -l /proc/<blackbox-id>/fd
은 stdout이 가고 /dev/null
stderr가 가고 있음을 알려줍니다 ~/.xsession-errors
.
창 관리자는 X 서버의 자식이므로 해당 자식 및 자식 출력은 X 서버와 동일한 위치로 이동합니다.
유일한 사용자이고 그래픽으로 로그인하는 경우 일부 시스템은 X 서버 인스턴스를 출력 콘솔에서 대체하므로 해당 VT로 전환하여 볼 수 있습니다. 일화 적으로 배열은 일반적으로 alt-ctrl-f1
X 인스턴스의 출력 콘솔이고 alt-ctrl-f7
X 디스플레이이지만 배열은 가능한 한 많이 확인할 수 있습니다. 처음 6 개는 일반적으로 로그인을 생성하지만 비어 있거나 파이프 출력으로 표시되지 않거나 더 많이 표시 될 수 있습니다. init에서 출력 될 수도 있고 X에서의 출력과 혼동하지 마십시오. 내 경험에 따르면 X와 어린이는 항상 많은 양의 경고와 메시지 (글꼴 누락, 감가 상각 된 호출 등)를 짖습니다.
GUI를 통해 로그인하지 않으면 X를 시작한 VT가 될 것입니다. 종료하기 전까지는 볼 수 없기 때문에 문제가됩니다. GUI 로그인으로 XDM (그래픽 로그인)이 권한있는 프로세스로 실행되므로 출력을 파이프로 전달할 수 있습니다 /dev/tty7
. startx 1>&2> /dev/tty7
올바른 수퍼 유저 권한이있는 경우 에도 ( ) 할 수 있습니다.
startx
또는 xinit
직접 ~/.xinitrc
필요한 경우 exec
원하는 창 관리자를 수행하기 전에 항상 필요에 따라 리디렉션을 조정할 수 있습니다 . 나는 이런 종류의 결과를 놓친 적이 없다. GUI 응용 프로그램이 생성하는 것에 관심이 있다면 터미널에서 실행합니다. 그러나 실제로 그것은 도움이 될 수 있으므로 stdout 및 stderr을 ~/.xinitrc
로 리디렉션 했습니다 ~/.xinitrc.out
.
당신은 일반적으로 그것을 가지고가는 경우에 하나 개의 프로그램이 일련의 작업을 수행하여 또 다른 시작 man 2 fork
및 man 2 execve
기본 파일 기술자에 의해 그 과정에서 다음은 열린 상태로 유지.
따라서 대답은 일반적으로 출력 / 오류가 부모의 프로세스 출력 / 오류가 포크 시간을 가리키는 위치로 이동한다는 것입니다 (부모 프로그램이 물론 리디렉션을 수행하지 않는 한). 부모 프로그램의 이름을 정확히 알지 못하면 더 구체적인 것을 주장 할 수 없다고 생각합니다. 창 관리자 프로세스는 다른 프로그램을 직접 시작하는 데 거의 관여하지 않습니다.
예를 들어 제 경우에는
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
ps faux
프로세스와 관련된 tty / pt를 확인하는 데 사용 합니다. 아니면 "?" 아마도 공허에서 길을 잃을 것입니다. (이것은 단지 생각이다, 내가 틀릴 수있다)