
バックアップスクリプトを実行するときは、まずルートに切り替えてtruecryptパーティションをマウントしてからスクリプトを実行します。
rootとしてtruecryptを実行した後、rootセッションを終了でき、truecryptは開いていることを確認しました。
なぜこれが起こるのですか?ルートセッションを閉じたらすぐに閉じる必要はありませんか?
コマンドの順序は次のとおりです。
su
truecrypt &
TruecryptのUIを使用して隠しボリュームをマウントしました。
./Backup.sh
次に一般的な手順は、Truecrypt ボリュームをアンマウントし、Truecrypt をオフにしてルートセッションを終了することです。ただし、root セッションを閉じると、Truecrypt は root 権限で実行され続けます。
答え1
バックグラウンドプロセスの取得アップグレードされたバージョン親プロセス(通常Linuxで)init
PID 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
次のようにして、これをさらに視覚化できます。
スクリプトを展開して、次の操作を行います。
#!/bin/sh sleep 8888 & sleep 9999 ecode=$? printf "Bye\n" exit $ecode
実行してください
./sleeplong2 &
(su
または実行しないでください)。top
上記と同じルーチンで開始して入力すると、パラメーターcが表示されます。他の端末では:
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信号を受信できないため、終了しません。