1

次のシェル スクリプトを使用して Java デーモン プロセスを起動しています (コマンドは root ユーザー経由で起動されます)。

 #!/bin/sh
 sudo -u postfix CONFIG_LOCATION=/mnt/custom java -Dcom.sun.management.jmxremote.port=10020 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.util.logging.config.file=${PresentWorkingDirectory}/logging.properties -cp "${ExecutableJar}:${PresentWorkingDirectory}${ClassPath}" com.x.y.filter <&- 1>/dev/null 2>&1 &

これにより、実行中の 2 つのプロセスが起動し、「ps -f -All」出力に次のレコードが表示されます。

4 S root     24250     1  0  82   0 - 26247 -      20:33 pts/1    00:00:00 sudo -u postfix CONFIG_LOCATION=/mnt/custom java -Dcom.sun.management.jmxremote.port=10020 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.util.logging.config.file=${PresentWorkingDirectory}/logging.properties -cp "${ExecutableJar}:${PresentWorkingDirectory}${ClassPath}" com.x.y.filter <&- 1>/dev/null 2>&1 &
4 S postfix  24252 24250 47  82   0 - 364460 184466 20:33 pts/1   00:00:31 java -Dcom.sun.management.jmxremote.port=10020 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.util.logging.config.file=${PresentWorkingDirectory}/logging.properties -cp "${ExecutableJar}:${PresentWorkingDirectory}${ClassPath}" com.x.y.filter <&- 1>/dev/null 2>&1 &

なぜ 2 つのプロセスが起動されるのか理解できません。

私は1つのプロセスだけを実行するつもりですが、シェルスクリプトも1つのプロセスしか起動していません。

誰かが上記の観察を説明してもらえますか?

これを修正するために何をする必要がありますか?

4

1 に答える 1

3

これは予期される動作です。プロセスであるを呼び出しsudoています。このプロセスは、ユーザーを に変更し、別のプロセスpostfixを呼び出しjavaます。

sudo使用すると(そのexecコマンドに使用されるプロセスが1つだけにjavaなるように)、実行すべきではないことを実行できるようになります(javaバイナリがメモリ内のプロセスを置き換え、バイナリがsudo持つすべての特権を持つためsudo)。おそらく悪い考えでしょう。

sudoバイナリは何もしないことに注意してください。バイナリは、java独自のクリーンアップを行う前に、終了するのを待っているだけです。

理解しておくべき重要なことの 1 つは、sudoこれは魔法のシステム ユーティリティではなく、ほんの少しの通常のアプリケーションであるということsetuidです。これは、sudoバイナリが実行時のユーザー UID を変更できることを意味します。これを見ると、どのようにsudo機能し、なぜ 2 つのプロセスが発生するのかが理解できるようになります。

于 2012-07-10T16:36:32.023 に答える