1

我正在使用以下 shell 脚本来启动 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 &

这导致两个正在运行的进程启动,我在“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 脚本也只启动一个进程。

有人可以解释上述观察吗?

需要做什么来纠正这个问题?

4

1 回答 1

3

这是预期的行为。您正在调用sudo,这是一个过程。此过程会将其用户更改为postfix,然后调用java- 另一个过程。

如果sudo使用exec(以便该命令只使用一个进程),那么java将能够运行它不应该运行的东西(因为java二进制文件将替换sudo内存中的那个,因此拥有该文件所拥有的所有权限sudo),这可能是个坏主意。

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

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

于 2012-07-10T16:36:32.023 回答