백그라운드에서 프로세스를 실행한다는 것은 정확히 무엇을 의미합니까?
$program
와 :의 차이점 $program&
은 입력 파일 설명자가 셸에서 상속되지 않는다는 것입니까, 아니면 다른 것이 있습니까?
답변1
program &
stdin
은 여전히 및 stdout
과 동일 program
하지만 일반적으로 (터미널 설정에 따라) 시스템이 신호를 통해 중지되지 않는 한 program &
읽을 수 없습니다 (참조stdin
SIGTTIN
https://en.wikipedia.org/wiki/Job_control_(Unix)#구현).
백그라운드 프로세스는 키보드 단축키( )로부터 신호를 받지 않으며 Ctrl-C, Ctrl-\, Ctrl-Z
, 물론 백그라운드에서 프로세스를 실행하면 셸을 계속 사용할 수 있습니다(예: 다른 프로세스 시작).
답변2
이것은 많은 것을 의미합니다.
- 백그라운드 프로세스는 터미널을 차단하지 않습니다. 완료될 때까지 기다리지 않기 때문에 "비동기적으로" 실행됩니다. 강제로 연결을 끊으면 여전히 죽습니다.
- 따라서 응답은 반드시 "활성"이 아니라 "수동"일 필요가 있으며 나중에 검사하기 위해 출력을 파일로 리디렉션하는 것이 좋은 형식입니다.
- 배치 솔루션(명령 파일, 응답 파일 또는 예상)을 고려하지 않는 한 대화형 입력은 문제가 됩니다.
- "장기 실행" 작업의 경우 서비스로 시작하는 것을 고려할 수 있습니다.
- 배후에 문제가 있는 경우 tmux 및 screen을 참조하여 대안을 찾아보세요.
답변3
포그라운드에서 프로세스를 시작하면 쉘은 wait()
다음 명령을 읽기 전에 프로세스가 완료될 때까지 기다립니다(일련의 시스템 호출 중 하나 사용). 백그라운드에서 프로세스를 시작하면 셸은 프로세스가 완료되거나 상태가 변경될 때까지 기다리지 않고 완료되거나 상태가 변경될 때까지 기다립니다. 다음 명령을 즉시 읽고 실행합니다.
당신이시작백그라운드 프로세스의 경우 원하는 대로 백그라운드와 전경 사이를 이동할 수 있습니다( ^Z
및 사용 bg
또는 사용 fg
). 이 점에서 모든 직업은 동일합니다. 유일한 제한 사항은 주어진 시간에 최대 하나의 포그라운드 작업이 있을 수 있다는 것과 백그라운드 작업이 쉘의 tty를 사용하려고 하면 중지된다는 것입니다.
포그라운드 작업이 없을 때마다 쉘은 다음 명령(스크립트 파일 또는 표준 입력에서)을 읽고 실행합니다.