2012-07-10 50 views
1

我使用下面的脚本来启动一个Java守护进程(命令经由根用户启动):重复过程经由外壳脚本推出

#!/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 & 

这导致两个运行的进程和我的发射在'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 & 

我无法理解为什么启动两个进程?

虽然我打算只运行一个进程,我的shell脚本也启动只有一个进程。

有人能解释一下上面的观察吗?

需要做些什么来纠正?

回答

3

这是预期的行为。你打电话给sudo,这是一个过程。这个过程会将其用户更改为postfix,然后致电java - 另一个过程。

如果sudo使用exec(以便有用于该命令只有一个进程),然后java将能够运行的东西应该不是(因为java二进制将取代内存中的sudo一个,等有所有的特权sudo),这可能是一个坏主意。

请注意,sudo二进制文件不会执行任何操作:在执行自己的清理之前,它只会等待java终止。

要理解的关键之一是sudo不是一个神奇的系统实用程序,它只是一个正常的应用程序,作为setuid位。这意味着,允许sudo二进制文件更改它的运行时用户uid。一旦你看到这个,你就开始明白sudo是如何工作的,以及你为什么得到两个过程。