표준 쉘(bash)의 경우(POSIX.1)

표준 쉘(bash)의 경우(POSIX.1)

나는 이 질문에 대한 가장 좋은 답변을 찾아보았습니다.nohup, disown, &의 차이점, 나는 구체적으로 다음을 읽었습니다.

작업은 여전히 ​​터미널에 연결되어 있으므로 disown 터미널이 파괴되면( 표준 입력에서 읽거나 표준 출력에 쓰는 pty터미널인 경우 발생할 수 있음)xterm작업으로 생성된SSHxtermSSH

disown터미널이 닫히면 작업이 종료되는 것을 막지 못하는 것 같습니다. nohup예, 하지만 작업 시작 시에만 가능합니다.

내가 이것을 올바르게 이해했다고 가정하면, 내가 시작한 일이 제대로 작동하도록 하려면 어떻게 해야 합니까?아니요 nohup터미널을 닫고 연결을 종료하면 SSH종료되지 않나요 ?


setopt NO_HUP명령줄에서 실행해도 괜찮나요? 그렇다면 동일한 터미널에서 실행 중인 모든 작업에 영향을 미치지 않습니까?

답변1

표준 쉘(bash)의 경우(POSIX.1)

로 시작하여 &기본값이 아닌 다른 것에서 읽도록 하고 stdin(== /dev/tty== /dev/stdin== /dev/fd/0) + 기본값이 아닌 다른 것을 쓰도록 하고 stdout(== /dev/tty== /dev/stdin== /dev/fd/1) ( 와 동일 stderr) 작업이 ' t 또는 일시중지되지 않음(=중지됨). 중지해야 하거나 터미널에서 읽어야 하고 작업 터미널이 정지된 후 계속하려면 작업의 프로세스에 핸들러(트랩)가 있는지 확인하십시오.한숨을 쉬다신호. 터미널에 써야 하고 터미널 정지 상태를 유지하려면 터미널에 쓰는 프로세스에 핸들러가 있는지 확인하세요.신호 파이프라인.

설명하다:

백그라운드 프로세스가 전송됩니다신호 입력터미널에서 데이터를 읽으려고 하는 순간. 기본 구성은 다음과 같습니다.신호 입력프로세스를 중지(=일시 중지)하는 것입니다. 터미널 정지로 인해 백그라운드 작업의 1세대 프로세스가 init로 상위가 변경되어 작업 프로세스의 1세대 프로세스 그룹이 고아 프로세스 그룹이 됩니다. (고아 프로세스 그룹은 다른 프로세스 그룹에 멤버가 없지만 동일한 세션에 상위 프로세스가 있는 프로세스 그룹입니다.) 시스템은 중지된(일시 중지된) 모든 고아 프로세스 그룹을 보냅니다.한숨을 쉬다이어서신호 제어(그들이 확실히 얻을 수 있도록한숨을 쉬다) 터미널이 중단될 때 정의에 따라 해당 프로세스 그룹의 어떤 프로세스도 동일한 세션의 상위 프로세스에 의해 깨울 수 없기 때문입니다. 따라서 이러한 프로세스는 시스템에 의해 깨어나야 하지만 동시에 정상 작동이 아닌 터미널 정지로 인해 깨어났다는 신호를 프로세스에 보냅니다.한숨을 쉬다이를 수행하기 위한 메커니즘이자 기본 구성입니다.한숨을 쉬다그냥 중단하세요.

터미널을 일시 중지하면 해당 터미널에 대한 후속 쓰기도 발생합니다.신호 파이프라인, 치료하지 않고 방치하면 치명적일 수도 있습니다.

긴 이야기 짧게 고아 프로세스 그룹이 일시 중지되지 않은 경우(다음을 통해)신호 입력아니면 ^Z든 뭐든 두려워할 필요 없어한숨을 쉬다신호를 터미널 대신 파일로 출력 stdout하고 stderr터미널 대신 파일에서 읽으면 두려워할 것이 없습니다.신호 파이프라인. 원시 터미널 대신 터미널 멀티플렉서에서 실행 중인 경우 걱정할 필요가 없습니다.한숨을 쉬다또는신호 파이프라인.


zsh의 경우

나는 조금 가지고 놀았고 실제로 while이 위에서 설명한 대로 동작한다는 zsh것을 발견했습니다 (위 동작은 POSIX.1을 준수해야 합니다) .bashzsh한숨을 쉬다도착하다달리기백그라운드 작업도 가능합니다. 위의 상황에서만 전송하도록 setopt NO_HUP설정하세요(또는 시스템, 여기서는 확실하지 않음) .SIGHUP

이를 테스트하려면 다음 명령을 실행해 보세요.

( rm -f hup; trap 'echo HUP > hup' HUP; sleep 100)

다양한 방법으로 (배경, 전경, 정지) 연결을 끊습니다. 그런 다음 hup파일이 생성되었는지 확인할 수 있습니다 . 이는 작업이 성공적으로 수행되었음을 의미합니다.한숨을 쉬다.

답변2

disown또는 를 사용해 보는 것이 유용할 수 있습니다( , nohup또는 은 사용하지 않지만 &). 두 도구 모두 여러 터미널을 실행하고 각 터미널에서 발생하는 작업을 중단하지 않고 터미널에서 분리할 수 있습니다. 더 편리한 것 같아요.screentmuxtmux


사용tmux

세션 이름을 지정할 수 있습니다.

tmux new-session -s ${SESSION_NAME}

첨부하지 않고 시작하고,

tmux new-session -d -s ${SESSION_NAME} '/home/user/script.sh'

세션 나열,

tmux list-sessions

아니면 그들에게 명령을 보내세요:

tmux send-keys -t ${SESSION_NAME} "echo Hello world"
tmux send-keys -t ${SESSION_NAME} Enter

물론 진행 중인 세션을 연결("열기")하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.

tmux attach-session -t ${SESSION_NAME}

그런 다음 닫지 않고 그대로 두고 를 Ctrl + B누르십시오 D.

답변3

프로그램을 다음과 같이 작성할 수 있습니다.일괄예를 들어 다음을 사용하여 작업합니다.여기 문서:

batch << EOJ
  ./yourprogram some $ARGUMENTS
EOJ

프로그램이 대화형으로 시작된 경우 일반적인 안전 솔루션이 표시되지 않습니다.~ 후에사용을 시작하다시스템(3)(예를 들어 system("$EDITOR /tmp/somefile.txt");...) 일부 X11 클라이언트 응용 프로그램 또는 일부는 다음을 사용합니다.터미널(4)

프로그램을 개선할 수 있다면 일부 프로그램 인수를 사용하여 프로그램을 호출하는 것을 고려할 수 있습니다.데몬(3)

다음과 같은 일부 터미널 관리자를 사용할 수도 있습니다.화면(1)등...

관련 정보