프로세스를 거부한 후에도 stdout 또는 stderr을 계속 수신하는 이유는 무엇입니까?

프로세스를 거부한 후에도 stdout 또는 stderr을 계속 수신하는 이유는 무엇입니까?

QEMU를 시작하고 즉시 거부했지만 여전히 셸에서 출력을 받습니다.

aburk@aburk:~$ su
Password: 
[root@aburk aburk]# QEMU_AUDIO_DRV="pa" QEMU_PA_SERVER="/run/user/1000/pulse/native" qemu-system-x86_64 -m 3096M -hda /dev/sdb -cpu host -smp cores=3,threads=1,sockets=1 --enable-kvm
WARNING: Image format was not specified for '/dev/sdb' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
^Z
[1]+  Stopped                 QEMU_AUDIO_DRV="pa" QEMU_PA_SERVER="/run/user/1000/pulse/native" qemu-system-x86_64 -m 3096M -hda /dev/sdb -cpu host -smp cores=3,threads=1,sockets=1 --enable-kvm
[root@aburk aburk]# bg
[1]+ QEMU_AUDIO_DRV="pa" QEMU_PA_SERVER="/run/user/1000/pulse/native" qemu-system-x86_64 -m 3096M -hda /dev/sdb -cpu host -smp cores=3,threads=1,sockets=1 --enable-kvm &
[root@aburk aburk]# 
(qemu-system-x86_64:19530): Gtk-WARNING **: Allocating size to GtkScrollbar 0x7f261f20c2c0 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate?

(qemu-system-x86_64:19530): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -150829368 and height 400

(qemu-system-x86_64:19530): Gtk-WARNING **: Allocating size to GtkScrollbar 0x7f261f20c4c0 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate?

(qemu-system-x86_64:19530): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -150829368 and height 400

(qemu-system-x86_64:19530): Gtk-WARNING **: Allocating size to GtkScrollbar 0x7f261f20c6c0 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate?

(qemu-system-x86_64:19530): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -150829368 and height 400
jobs -p
19530
[root@aburk aburk]# disown 19530
[root@aburk aburk]# 
[root@aburk aburk]# 
[root@aburk aburk]# 
(qemu-system-x86_64:19530): Gtk-WARNING **: Allocating size to GtkScrollbar 0x7f261f20c2c0 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate?

(qemu-system-x86_64:19530): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -150829368 and height 900

(qemu-system-x86_64:19530): Gtk-WARNING **: Allocating size to GtkScrollbar 0x7f261f20c4c0 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate?

(qemu-system-x86_64:19530): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -150829368 and height 900

(qemu-system-x86_64:19530): Gtk-WARNING **: Allocating size to GtkScrollbar 0x7f261f20c6c0 without calling gtk_widget_get_preferred_width/height(). How does the code know the size to allocate?

(qemu-system-x86_64:19530): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -150829368 and height 900

View 메뉴에서 QEMU의 크기를 조정하여 GTK 경고를 수동으로 실행할 수 있습니다.

제가 그 과정을 정확하게 부정하고 있는 것이 아닌가요? 출력이 계속 수신되는 이유는 무엇입니까?

쉘을 완전히 닫고 새 쉘을 열고 루트로 su하면 QEMU 크기를 얼마나 자주 조정하더라도 이러한 메시지가 표시되지 않는다는 것을 알았습니다.

이것이 어떻게 작동하는지 알고 싶습니다.

답변1

disown활성 작업 목록(셸에 의해 유지 관리됨)에서는 작업만 제거되므로 셸이 종료될 때 해당 프로세스가 종료되지 않습니다. 프로세스의 I/O 설정(표준 입력, 출력 및 오류)은 변경되지 않습니다. 따라서 거부된 작업의 출력은 작업이 시작된 터미널로 계속 전송되거나 리디렉션된 곳으로 리디렉션됩니다. 터미널을 닫으면(출력이 있다고 가정) 출력이 손실되고 새 셸을 열어도 출력이 복원되지 않습니다. 이 경우 프로세스가 터미널에서 읽기 또는 쓰기를 시도하자마자 중단 신호를 받습니다.nohup, disown, &의 차이점더 알아보기.

문제를 완전히 방지하려면 시작 시 프로세스의 출력을 /dev/null출력으로 리디렉션할 수 있습니다.

관련 정보