답변:
스크립트를 시작하고 터미널을 방해하는 출력없이 스크립트를 실행 한 다음 나중에 스크립트와 상호 작용할 수 있도록하려면 터미널 멀티플렉서를 살펴볼 수 있습니다. 시스템에 따라 tmux
또는 을 권장 screen
합니다. 아래 링크에서 사용 방법에 대한 정보를 찾을 수 있습니다.
tmux :
화면:
편집 : TMUX 프라이머에 대한 링크 추가
nohup 은 터미널에서 명령의 연결을 끊지 않고 스크립트를 무시하고 파일로SIGHUP
리디렉션하므로 로그 아웃 한 후에도 명령이 백그라운드에서 계속 실행될 수 있습니다.stdout/stderr
nohup.out
nohup
백그라운드에서 실행되는 명령을 자동으로 넣지 않습니다. 명령 줄을로 끝내면 명시 적으로 그렇게해야합니다 &
.
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobs
현재 실행중인 작업 및 상태를 인쇄 할 수 있습니다. 명령이 명령 jobs
을 찾을 수 없으면 더 이상 해당 쉘 의 하위 프로세스 가 아닙니다 .
$ jobs
[1]+ Running nohup ./script.sh &
fg
로 실행하더라도 백그라운드 작업을 bash에서 포 그라운드로 되돌릴 수 있습니다 nohup
. 그러나 출력 리디렉션nohup.out
은 변경되지 않으며 여전히 파일로 이동합니다 .
$ fg
nohup ./script.sh
쉘 / 터미널을 닫거나 로그 오프하면 명령이 더 이상 해당 쉘의 자식이 아닙니다. init
프로세스에 속합니다 . 검색 pstree
하면 프로세스 1 ( init
)이 소유하고 있음을 알 수 있습니다. 전경이 더 이상 존재하지 않으므로 전경으로 다시 가져올 수 없습니다.
If the command jobs cannot find it, then it is no longer a child process of that shell.
이것은 잘못된 것입니다.이 순서를 시도하여 방법을 확인하십시오 sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$
.. 이 명령 후에도 sleep
생성했을 때 동일한 PID로 출력 된 작업을 볼 수 있지만 jobs
아무 것도 인쇄하지 않습니다. 자식 프로세스가 자식이되는 것을 막을 수있는 유일한 방법은 부모를 잃고 (고아가 자식이 됨 init
) 또는 포크 + 종료 (PID가 변경되므로 원래 자식이 아님)입니다.
두 번째로 터미널 멀티플렉서를 사용하지만 화면이 아닌 tmux를 사용하겠습니다 . 화면은 모든 의도와 목적을 위해 유지되지 않습니다. 그 구성은 어두운 예술이며 Necronomicon의 부록에 처음 기록되었을 것입니다. 자신의 설정을 작성하는 것은 Cthulu를 살짝 보여주는 것입니다. 진심으로. 사람들의 .screenrc 파일을 살펴보십시오 . 확실하게, 구성 파일의 화면 혐오를 중재하는 방법이 있습니다. Byobu 는 필사자의 사용자와 부정한 코드 사이의 베일로 훌륭한 일을합니다. 합리적인 색상, 메뉴 인터페이스 및 상태 표시 줄이 가장 중요합니다.
그러나 내가 말했듯이 대신 tmux 를 권장 합니다. 여전히 약간의 구성이 필요하지만 문서화 되어 있으며 구성 파일은 횡설수설처럼 보이지 않습니다. 또한 색상과 상태 표시 줄로 시작합니다. 내 screenrc 및 tmux.conf 파일을 비교하십시오.
&
마지막에 ' '가 추가 된 모든 Linux 명령을 백그라운드로 보낼 수 있습니다 .
모든 백그라운드 작업을 보려면 발행 할 수 있습니다 jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
여기서는 백그라운드에서 zookeeper, kafka 및 mongo daemon의 3 가지 작업을 실행하고 있습니다. [1], [2] 및 [3]은 이러한 작업에 대한 작업 번호입니다.
다음을 사용하여 해당 작업을 포 그라운드로 가져올 수 있습니다 fg %$taskNumber.