通过shell脚本启动重复的进程

时间:2012-07-10 16:34:22

标签: java bash shell

我使用以下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脚本也只启动一个进程。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

要理解的一个关键事项是sudo不是魔术系统实用程序,它只是一个普通的应用程序,作为setuid位。这意味着,允许sudo二进制文件更改其运行时user-uid。看到这一点后,您就会开始了解sudo的工作原理以及为什么会有两个流程。