プログラムをrootとして開き、rootセッションを閉じましたが、プログラムはまだ実行中です。

プログラムをrootとして開き、rootセッションを閉じましたが、プログラムはまだ実行中です。

バックアップスクリプトを実行するときは、まずルートに切り替えてtruecryptパーティションをマウントしてからスクリプトを実行します。

rootとしてtruecryptを実行した後、rootセッションを終了でき、truecryptは開いていることを確認しました。

なぜこれが起こるのですか?ルートセッションを閉じたらすぐに閉じる必要はありませんか?

コマンドの順序は次のとおりです。

su

truecrypt &

TruecryptのUIを使用して隠しボリュームをマウントしました。

./Backup.sh

次に一般的な手順は、Truecrypt ボリュームをアンマウントし、Truecrypt をオフにしてルートセッションを終了することです。ただし、root セッションを閉じると、Truecrypt は root 権限で実行され続けます。

ベストアンサー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


もう一度試すもう1つの方法は、sleep 実行中のbash(または同様のもの)を終了することです。


たとえば、次のようにすることもできません。

$ su testuser -c './sleeplong &'

もっと明確になってほしいです。

おすすめ記事