プログラムを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 &'

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

答え2

truecrypt コマンドの後のアンパサンドです。これにより、truecrypt セッションがバックグラウンドで実行されます。 & 記号を削除すると、端末ウィンドウが閉じたときに閉じます。

&を維持するには、そのfgコマンドを使用してセッションを前景にインポートし、ウィンドウでセッションを閉じる必要があります。jobs複数のタスクがある場合は、それを使用してバックグラウンドのすべてのタスクを一覧表示します。

答え3

これは意図的に設計されています。

セッションを閉じても、すべてのユーザーのプログラムが閉じられるわけではありません。これは意図的に設計されています。一方、ユーザーは別のセッションでプログラムを実行できます。ユーザーは、端末にログインしていないときにバックグラウンドでプログラムを実行したい場合があります(screenまたはtmuxこの方法は特に人気があります)。

セッションを閉じると、デフォルトでユーザーと対話するためのプログラムの出口が削除されます。テキストモードセッションでは、プログラムは端末が消えたという通知を受け取ります(ため息をつく) GUI セッションでは、プログラムに情報が渡されます。Xサーバー消えた。この状況では、ほとんどのプログラムが終了します。

Truecrypt は通常望ましい動作であるため、実行を継続する準備をします。 Truecryptプロセスは、他のプロセスがファイルシステムを使用しているかどうかを知ることができないため、ファイルシステムが明示的にアンマウントされるまで実行されます。これは非常に一般的なユースケースです。ボリュームをマウントするためにログインし、ログアウトし、他のユーザーまたは自動化されたタスクでそのボリュームを使用できるようにします。

ログオフしても、プロセスが実行されているユーザーは魔法のように変わりません。とにかく何に置き換えるべきですか?

ファイルシステムの使用が完了したら、マウントを解除する必要があります。これは Truecrypt だけでなく、すべてのファイルシステムで動作します。すべてのTruecryptファイルシステムがアンマウントされた後、Truecryptプロセスを終了できます。

答え4

職場では確認できませんが、truecryptプロセスはデーモンで始まりますか?私は、pid 1のinitプロセスがtruecryptプロセスの親プロセスですか?

その場合、ルートシェルを終了してもログアウトからSIGHUP信号を受信できないため、終了しません。

関連情報