모든 프로세스가 터미널에 인쇄할 수 있음에도 불구하고 일부 프로세스는 Linux 터미널의 백그라운드에서 실행될 수 없는 반면 다른 프로세스는 실행할 수 있는 이유는 무엇입니까?

모든 프로세스가 터미널에 인쇄할 수 있음에도 불구하고 일부 프로세스는 Linux 터미널의 백그라운드에서 실행될 수 없는 반면 다른 프로세스는 실행할 수 있는 이유는 무엇입니까?

우분투에서 Linux 터미널을 사용하고 있습니다.

seq 100 1 | less &백그라운드에서 실행 하려고 작성하면 중지됩니다.

를 사용하는 등 백그라운드에서 실행하기 위해 다른 방법도 사용했지만 bg [jobnr]그냥 중지되었습니다.

Job 번호를 찾아서 적어놨는데 bg 1(1일 때) 프로세스를 확인해 보니 실행이 되지 않는군요.

man pi다른 "맨 페이지"에서도 같은 일이 발생합니다.

그러나 pi 10000000백그라운드에서 실행될 수 있으며 완료되면 터미널에 파이 번호가 인쇄됩니다.

less다음 은 백그라운드에서 실행될 수 있는지와 그렇지 않은 이유를 확인하는 작업입니다 . 온라인으로 검색해봐도 원인에 대한 정보는 많지 않았습니다.

둘 다 터미널에 인쇄하는데 일부 프로세스는 백그라운드에서 실행되지 않고 다른 프로세스는 실행되는 이유는 무엇입니까?

답변1

less제어 터미널과 상호 작용을 시도하고 있으므로 백그라운드에서 실행할 수 없으며 이로 인해 강제로 중지됩니다. 포그라운드 프로세스만 터미널에서 데이터를 읽거나 터미널 설정을 변경할 수 있습니다.

SIGTTOU백그라운드 프로세스가 터미널 설정을 변경하려고 하면 신호를 받습니다 . 터미널에서 데이터를 읽으려고 하면 신호를 받습니다 SIGTTIN. 두 신호 모두 정지하게 만듭니다. 프로세스가 계속 실행되고 이러한 신호를 무시하면 해당 신호를 발생시킨 작업이 실패할 수 있으므로 이는 이 문제에 대한 해결책이 아닙니다(예: 터미널에서 읽기가 오류와 함께 실패함 EIO).

노트:

less대부분의 편집기나 쉘과 같은 다른 대화형 프로그램처럼 제어 터미널이 stdin 또는 stderr라고 가정하는 대신 작동하기 위해 command | less제어 터미널을 직접 연다는 점에서 독특합니다 ./dev/tty

stty tostop백그라운드 프로그램이 시도하도록 터미널을 구성할 수 있습니다.쓰다제어 터미널에 대한 작동도 중지되지만 이는 어디에서나 기본 설정이 아니며 그다지 실용적이지 않습니다.

답변2

왜냐하면 터미널 접근이 필요하기 때문이죠.

프로세스가 백그라운드에서 실행 중인 경우 모든 터미널 입력은 포그라운드에서 실행 중인 프로세스(아마도 셸)로 전송됩니다. 문자를 읽어야 할 때 백그라운드 프로세스가 문자를 선택하면 일반적인 포그라운드 작업을 방해하게 됩니다. 이것이 어디로 이어질 수 있는지 이해하려면 백그라운드 프로세스가 그 사이에 터미널만 읽을 수 있다면 어떤 일이 일어날지 생각해 보십시오.

Process1: important data(bg)    you type      Process2: just a quiz-game (fg)
output                                        output
                                             
Do you want to quit(q) or                     How do you call a group of 5 
   continue (c)                                     music players?
                          <-      q

OK, quit, save data?              u     ->
                                  i     ->
                          <-      n
                                  t     -> 
Ok destroyed all data.            e     ->
                                  t     ->
                                 <enter>->           Wrong answer: uitet.

다음 스크립트를 예로 사용하여 이것이 어떻게 작동하는지 확인할 수 있습니다.

#!/bin/bash

while read sentence ; do
        echo "$sentence"
        echo '----------------'
        head -1 /dev/tty
done

readSTDIN의 입력을 정상적으로 읽습니다. 모든 콘텐츠를 리디렉션할 수 있습니다. 이렇게 하면 head -1 /dev/tty터미널에서 입력이 강제됩니다. 포그라운드에서 실행하면 스크립트는 사용자가 제공하는 각 입력에 대해 한 줄을 제공합니다.

이 스크립트를 백그라운드에서 실행하면 cat tst.sh | bash tst.sh &터미널에서 명시적으로 입력이 필요한 지점에서 중지됩니다.

관련 정보