$ pdfgrep -R -i spark . | less &
$ pdfgrep -R -i spark . &
$ jobs
[3]- Stopped pdfgrep -R -i spark . | less
[4] Running pdfgrep -R -i spark . &
왜 그것을 가지고 있는 것은
| less
멈추고, 그렇지 않은 것은 실행되고 있습니까?중지된 백그라운드 작업은 표준 입력에서 읽히지 않습니다. 그러므로 그것은 이유가 될 수 없습니다.
작업을 백그라운드로 설정한 이유는 동일한 터미널 세션에서 다른 작업을 수행할 수 있기 때문입니다.
내가 파이프를 사용하는 이유
less
는 다른 일을 하는 동안 stdout으로의 출력이 터미널 세션의 화면을 어지럽히는 것을 원하지 않기 때문입니다.위의 두 가지 목표를 달성할 수 있는 방법이 있나요? 파일을 기억하고 읽고 삭제하는 데 더 많은 시간이 걸리기 때문에 출력을 파일에 저장하는 것보다 출력을 파일에 저장하지 않는 것이 약간 더 좋습니다.
감사해요.
답변1
무슨 일이 일어나고 있는지 자세히 살펴보겠습니다 less
.
$ pdfgrep -R -i spark . | strace less &
[...]
open("/dev/tty", O_RDONLY|O_LARGEFILE) = 3
ioctl(3, TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted if SA_RESTART is set)
--- SIGTTOU {si_signo=SIGTTOU, si_code=SI_KERNEL} ---
--- stopped by SIGTTOU ---
작업 제어는 백그라운드 작업의 프로세스가 제어 터미널에서 특정 작업을 수행하는 것을 제한합니다.
백그라운드 프로세스가 터미널에서 데이터를 읽으려고 하면
SIGTTIN
일반적으로 프로세스를 중지(일시 중지)하는 신호가 전송됩니다.백그라운드 프로세스가 터미널에 대한 매개변수 설정을 시도하면 신호가
SIGTTOU
해당 프로세스로 전송되며 일반적으로 프로세스도 중지됩니다.그게 여기서 일어난 일이야TCSETSW
I/W 제어. 프로그램less
은 시작 후 즉시, 표시할 항목이 있는지 알기 전에도 터미널을 원시 모드로 전환하려고 시도합니다.여기에는 타당한 이유가 있습니다. 즉, 원시 모드가 켜져 있고 에코가 꺼져 있는 것처럼 백그라운드 작업이 터미널을 비동기적으로 변경하는 것을 원하지 않습니다. (백그라운드 프로세스는얻다멈추지 않고 ioctl에 대한 터미널 인수를 사용하십시오
TCGETS
. 위 목록을 참조하십시오. )백그라운드 프로세스가 터미널에 쓰기를 시도하고 터미널에 플래그가 설정되어 있으면
tostop
신호가 터미널로 전송됩니다SIGTTOU
.
tostop
플래그가 설정 되어 있지 않을 수 있습니다 (실행 stty -a
하여 확인). 이렇게 하지 않으면 이러한 백그라운드 명령은 pdfgrep -R -i spark . &
터미널 설정을 변경하지 않으며 시도할 경우 터미널에 쓸 수 있습니다.
당신은 또한 다음과 같이 썼습니다:
내가 less를 사용하는 이유는 다른 일을 하는 동안 stdout으로 출력하여 터미널 세션 화면을 어지럽히는 것을 원하지 않기 때문입니다.
less 프로그램은 결국 한 번에 한 화면씩 출력을 터미널로 보냅니다. stty tostop
before pdfgrep | less &
또는 before 를 실행하면 pdfgrep &
포그라운드에 있는 경우에만 터미널로 출력됩니다.
답변2
두 번째 질문에 대답하려면: 저는 tty와 같은 장치를 통해 많은 명령을 다중화하기 위해 screen(1)을 사용합니다.
- 홈페이지그리고수동--이것은 GNU 프로젝트입니다.
- "Linux 터미널 관리를 위한 10가지 화면 명령 예"
적어도 하나선택하다, tmux(1) 및 byobu(1)(두 가지 모두에 대한 단순화된 래퍼)입니다.
답변3
less
TTY와 상호 작용(출력)하려고 시도 중이지만 백그라운드 작업으로 실행 중이므로 쓸 TTY가 없습니다. pdfgrep
반면에 이 유틸리티는 표준 출력에 기록합니다.
내 시스템에서는 더 설명적인 출력을 얻습니다.
$ cat ~/.profile | less &
[1] 51758 67354
$
[1] + Done cat ~/.profile |
Stopped (tty output) less
이 간단한 예에서 cat
완료는 my .profile
를 로 보내지 less
만 less
백그라운드 작업이기 때문에 표시할 수 없습니다. 따라서 이 Stopped (tty output) less
메시지가 표시됩니다.
그러나 less
프로세스는 여전히 실행 중입니다. 이것은 단지일시적으로중지되었습니다. 이를 전환하려면 다음을 사용하십시오 fg %1
(이 숫자는 "중지됨" 메시지에서 대괄호 안에 보고된 작업 번호에 해당하며 작업을 시작할 때도 보고되어야 함).