프로그램을 루트로 열고 루트 세션을 닫았지만 프로그램은 여전히 ​​실행 중입니다.

프로그램을 루트로 열고 루트 세션을 닫았지만 프로그램은 여전히 ​​실행 중입니다.

백업 스크립트를 실행할 때 먼저 루트로 전환하고 truecrypt 파티션을 마운트한 다음 스크립트를 실행합니다.

루트로 truecrypt를 실행한 후 루트 세션을 종료할 수 있고 truecrypt는 계속 열려 있는 것을 확인했습니다.

왜 이런 일이 발생합니까? 루트 세션을 닫자마자 닫혀야 하지 않나요?

명령 순서는 다음과 같습니다.

su

truecrypt &

Truecrypt의 UI를 사용하여 숨겨진 볼륨을 마운트했습니다.

./Backup.sh

그런 다음 일반적인 단계는 Truecrypt 볼륨을 마운트 해제하고 Truecrypt를 끄고 루트 세션을 종료하는 것입니다. 그러나 루트 세션을 닫으면 Truecrypt는 루트 권한으로 계속 실행됩니다.

답변1

백그라운드 프로세스 획득업그레이드된 버전상위 프로세스(일반적으로 Linux에서) initPID 1.

분명히 &는 백그라운드에서 실행하는 것입니다. 문제는 루트가 시작되었지만 루트가 더 이상 활성화되지 않은 경우 루트가 계속 실행되는 이유는 무엇입니까?

root시스템이 실행되는 동안 활성화됩니다. ( root좋다이것뿌리. )

root어쨌든 이는 사용자 자신과는 아무런 관련이 없습니다. 시작하는 프로세스는 터미널(또는 이와 유사한 것)에 의존하지 않으므로 상위 프로세스를 종료해도 하위 프로세스가 종료되지 않습니다. 일시적으로 고아가 된 후 입양되는 경우가 많습니다 init.

많은 프로세스가 다른 계정으로 실행되고 있습니다. 예를 들면 다음과 같습니다.

ps aux | awk 'NR>1{print $1}' | sort -u

이를 설명하기 위해 다른 계정을 사용할 수 있습니다 testuser.

sleeplong:

#!/bin/sh
sleep 9999

저장하고 cmod +x sleeplong. 운영 testuser:

user@host $ su testuser
testuser@host $ ./sleeplong &
[1] 9692

PID로 열기 top:

user@host $ pids="$(pstree -cpsa 9692 | \
sed 's/ *[^,]*,\([0-9]*\).*/\1/' | tr '\n' ',')"; \
top -w 90 -p ${pids}1

입력 V받기 트리

  PID USER         TIME+  COMMAND
    1 root        0:01.03 init
19787 user       95:30.58  `- terminal
 8835 user        0:00.16      `- bash
 9634 testuser    0:00.04          `- su
 9642 testuser    0:00.09              `- bash
 9692 testuser    0:00.00                  `- sleeplong
 9693 testuser    0:00.00                      `- sleep

출구:

testuser@host $ exit

최상위 루틴을 다시 실행합니다.

  PID USER       TIME+  COMMAND
    1 root      0:01.03 init
 9692 testuser  0:00.00  `- sleeplong
 9693 testuser  0:00.00      `- sleep

다음을 수행하여 이를 더욱 시각화할 수 있습니다.

  1. 스크립트를 확장하여 다음을 수행합니다.

    #!/bin/sh
    sleep 8888 &
    sleep 9999
    ecode=$?
    
    printf "Bye\n"
    
    exit $ecode
    
  2. 실행하세요 ./sleeplong2 &( su또는 실행하지 마세요).

  3. top위와 동일한 루틴으로 시작하고 입력하면 c매개변수가 표시됩니다.
  4. 다른 터미널에서는:

    kill NNN # Where NNN=PID of sleep 8888
    kill NNN # Where NNN=PID of sleep 9999
    

최종 종료 코드는 kill일반적으로 143. 그건

128 + 15 = 143

기본값 kill은 15 또는 입니다 SIGTERM.


시도해 볼 또 다른 방법은 sleep 실행 중인 bash(또는 이와 유사한)를 종료하는 것입니다.


예를 들어 다음과 같이 할 수도 없습니다.

$ su testuser -c './sleeplong &'

좀 더 명확해졌으면 좋겠습니다.

답변2

truecrypt 명령 뒤의 앰퍼샌드입니다. 이로 인해 truecrypt 세션이 백그라운드에서 실행됩니다. & 기호를 제거하면 터미널 창이 닫힐 때 닫힙니다.

&를 유지하려면 해당 fg명령을 사용하여 세션을 전경으로 가져온 다음 창과 함께 세션을 닫아야 합니다. jobs여러 작업이 있는 경우 이를 사용하여 백그라운드의 모든 작업을 나열합니다.

답변3

이것은 의도적으로 설계된 것입니다.

세션을 닫아도 모든 사용자의 프로그램이 닫히지는 않습니다. 이것은 의도적으로 설계된 것입니다. 한편, 사용자는 다른 세션에서 프로그램을 실행할 수 있습니다. 사용자는 터미널에 로그인하지 않았을 때 백그라운드에서 프로그램을 실행하기를 원할 수도 있습니다( screen또는 tmux이 방법이 특히 인기가 있습니다).

세션을 닫으면 기본적으로 사용자와 상호 작용하기 위한 프로그램의 출구가 제거됩니다. 텍스트 모드 세션에서 프로그램은 터미널이 사라졌다는 알림을 받습니다(한숨을 쉬다) GUI 세션에서 프로그램에 정보가 전달됩니다.X 서버사라졌습니다. 이 상황에서는 대부분의 프로그램이 종료됩니다.

Truecrypt는 일반적으로 바람직한 동작이므로 계속 실행되도록 준비합니다. Truecrypt 프로세스는 다른 프로세스가 파일 시스템을 사용하고 있는지 여부를 알 수 없으므로 파일 시스템이 명시적으로 마운트 해제될 때까지 실행됩니다. 이는 매우 일반적인 사용 사례입니다. 볼륨을 마운트하기 위해 로그인하고, 로그아웃하고, 다른 사용자나 자동화된 작업에서 해당 볼륨을 사용하도록 허용합니다.

로그오프해도 프로세스가 실행 중인 사용자가 마법처럼 변경되지는 않습니다. 그나저나 무엇으로 바꿔야 할까요?

파일 시스템 사용을 마친 후에는 마운트를 해제해야 합니다. 이는 Truecrypt뿐만 아니라 모든 파일 시스템에서 작동합니다. 모든 Truecrypt 파일 시스템이 마운트 해제된 후 Truecrypt 프로세스를 종료할 수 있습니다.

답변4

직장에서는 확인할 수 없는데 truecrypt 프로세스가 데몬으로 시작되나요? 내 말은, pid 1의 init 프로세스가 truecrypt 프로세스의 상위 프로세스입니까?

그렇다면 루트 셸을 종료하더라도 로그아웃에서 SIGHUP 신호를 받지 못하므로 종료되지 않습니다.

관련 정보