셸을 종료할 때 프로세스가 중지되는 것을 방지하려면 nohup
또는 를 통해 명령을 시작할 수 있습니다 screen
. 다음 명령을 사용하여 기존 프로세스를 거부할 수도 있습니다.
mycommand
# Press CTRL-Z
bg
disown %1
그러나 이것은 현재 쉘에서만 시작할 수 있습니다.
다른 쉘/ssh 세션을 사용하여 동일한 작업을 수행하고 싶습니다(명령어로 시작됨).껍데기, 그러나 출시가 거부됨쉘 B).
다른 셸에서 프로세스를 백그라운드로 넣을 수 있습니다.
# CTRL-Z can be done via
kill -20 PID (SIGSTP)
# bg can be done via
kill -18 PID (SIGCONT)
그러나 프로세스는 여전히 초기 쉘의 소유입니다. 다른 쉘의 프로세스를 어떻게 거부할 수 있습니까?
저는 리눅스 4.15를 사용하고 있습니다.
답변1
이건 불가능 해.
훌륭한,이것은디버거를 사용하고 쉘 프로그램을 실행하는 프로세스의 내부를 파헤칠 준비가 되었다면. 더 구체적으로 말하자면, 쉘 프로그래밍 수준에서는 이는 간단한 방법으로는 불가능합니다.
disown
이는 쉘이 각 개별 쉘 프로세스의 메모리 공간에 유지하는 "작업" 목록에 영향을 미치기 때문입니다 .
셸(즉, 작업 제어 프로세스)은 해당 프로세스를 잊으라는 지시를 받을 때까지 내부 "작업 테이블"에서 분기한 하위 프로세스를 기억하거나, disown
하위 프로세스가 종료되고 셸이 종료된 작업을 수행하고 보고할 때까지 하위 프로세스에 영향을 주지 않습니다 wait()
. disown
프로세스 프로세스 상태어떠한 방식으로. 이는 쉘의 기능에 영향을 미칩니다.
disown
교육과정을 잊어버리기 때문에 …
wait()
… 자녀를 해고하겠다고 통보하면 더 이상 “작업”의 완료를 인정하지 않습니다.exit
... / 라고 말할 때 프로세스가 여전히 실행 중인지 더 이상 신경 쓰지 않습니다logout
.- ...자체 프로세스가 중단 신호를 수신할 때(또는 일부 쉘 프로그램의 경우 종료되어 대화형 로그인 쉘임을 인식할 때) 더 이상 하위 프로세스에 중단 신호를 보내지 않습니다.
셸은 이러한 목록을 공유하지 않으며 다른 프로세스에서 쉽게 액세스할 수 없습니다(위에서 언급한 것처럼 디버거를 시작하고 연결하지 않고). disown
관련 쉘 프로세스 자체 내에서 실행되는 내장 명령 외에 이에 액세스할 수 있는 IPC 메커니즘이나 명령줄 도구는 없습니다 . (이것은왜이는 내장된 명령입니다. )
그렇기 때문에 disown
동일한 로그인 세션 내에서도 두 번째 셸에서 작업을 실행할 수 없습니다. disown
그것은 완전히 각 쉘과 각 쉘 프로세스의 문제입니다.
또한…
프로세스는 다른 셸에서 백그라운드로 실행될 수 있습니다.
사실, 그것은 당신이 항상 하는 일이 아닙니다.
개념전망그리고배경세션의 제어 터미널과 관련됩니다. 구체적으로, 제어 단말은 프로세스 그룹, 즉포그라운드 프로세스 그룹. 프로세스 자체를 중지했다가 계속한다고 해서 프로세스가 포그라운드와 백그라운드 간에 전환되는 것은 아닙니다. 터미널을 제어하는 포그라운드 프로세스 그룹을 업데이트해야 합니다.게다가. ㅏ포그라운드 프로세스이 전경 프로세스 그룹의 구성원이기 때문에 전경에 있는 것입니다. 세션의 다른 모든 프로세스 그룹과 이러한 프로세스 그룹의 프로세스는 백그라운드에 있습니다.
아이러니하게도 다른 쉘에서는 이 작업을 수행하지 않습니다. 당신이 하고 있는 일이 촉발되고 있어요원래 쉘 프로세스가 조치를 취합니다.. 전경 프로세스 그룹의 기본 프로세스가 중지되는 것을 확인하고 이에 대한 응답으로 터미널의 전경 프로세스 그룹을 조정합니다(자체 프로세스 그룹으로 돌아가기).
SIGTSTP
그건 그렇고, 올바른 신호입니다.
추가 읽기
답변2
Solaris를 사용하는 경우 다음으로 전화할 수 있습니다.
nohup -p <pid>
그러면 현재 제어 터미널이 제거되고 stdout이 파일 시스템의 파일에 연결됩니다.
이를 수행하려면 커널(이 경우 /proc 파일 시스템)의 지원이 필요합니다. Solaris는 2001년에 이 프로그램에 대한 지원을 추가했습니다 nohup
. 다른 플랫폼이 다른 터미널에서 실행 중인 프로세스에 디버거를 연결할 수 있는 경우 이 기능을 추가할 수 있습니다.
참고: 프로세스가 이전에 실행되고 있던 셸을 살펴보면 셸의 wait() 호출에 "자식 프로세스 없음" 오류 메시지가 표시될 수 있습니다.
현재 다른 플랫폼에서 유사한 구조를 인식하지 못합니다.