disown
일을 마치고 마음이 바뀌면 bash
어떻게든 취소할 수 있나요?
그렇다면 한 단계 더 나아가 임의의 프로세스를 작업 제어 하에 두는 것이 가능합니까(허용 가능한 한도는 내가 프로세스를 소유한다는 것입니다)?
궁극적으로 다음과 같은 워크플로가 가능해집니다.
- 작업을 백그라운드에 넣습니다(
^z
다음에bg
). - pid를 얻으세요 (
jobs -p %+
얻으세요<pid>
) screen
또는 세션 을 열고tmux
연결한 후 이를 사용하여 다음 단계를 수행합니다.- 일자리를 구하는 데 사용됨
reptyr
(reptyr <pid>
) <pid>
쉘에 작업 제어가 추가되었습니다 (이것이 가능한가?)- 그만 일해(
^Z
)
마지막 두 단계만 빼고는 다 할 수 있어요. ^Z
프로세스가 셸의 작업 목록에 없기 때문에 작업 중지를 사용해 도 아무런 효과가 없습니다.
내 연구에 따르면 불가능합니다.내 자신의(대신 disown
) a pid 하지만 내가 틀렸기를 바라요...
답변1
일반적으로 쉘이 작업을 "채택"하는 것은 불가능합니다. 셸의 경우 작업은 다음을 의미합니다.
- 작업 식별자를 프로세스 ID와 연결합니다.
- 상태(실행 중, 일시 중지됨, 종료됨)를 표시합니다.
- 상태가 변경되면 사용자에게 알립니다.
- 터미널이 사라지면 SIGHUP 신호를 보냅니다.
- 작업이 터미널을 "소유"하는지 여부(포그라운드 프로세스 그룹에 있는지 여부)를 제어합니다.
대부분은 쉘과 작업 사이에 특별한 연관이 필요하지 않지만 일부는 다음을 수행합니다.
- 상태가 변경되면 사용자에게 알리기 위해 쉘은 수신에 의존합니다.SIGCLD 신호. 이 신호는 커널에 의해 작업 초기 프로세스의 상위 프로세스로 전송됩니다.
- 터미널에 대한 액세스를 제어하려면 쉘이 작업과 동일한 세션에 있어야 합니다.
프로세스가 다른 프로세스를 채택하거나 기존 세션에 프로세스를 첨부하는 것은 불가능합니다. 따라서 채택을 지원하려면 셸에서 일부 상태를 관리해야 합니다. 일반 쉘은 아직 이것을 구현하지 않습니다.
특수한 경우, 작업이 처음에 이 셸에 의해 시작된 후 거부되면 이러한 문제는 발생하지 않습니다. 그러나 일반 셸 중 어느 것도 처음 시작될 때 작업을 추가할 수 있는 예외를 구현하지 않습니다.
귀하의 시나리오에서는 일반적으로 화면 또는 tmux 세션에서 작업을 시작하는 것이 가장 편리하며, 작업을 일시 중지하거나 재개하려는 경우 PID를 사용할 수 있습니다.