我使用以下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脚本也只启动一个进程。
有人可以解释上述观察结果吗?
需要做些什么来纠正这个问题?
答案 0 :(得分:3)
这是预期的行为。您正在调用sudo
,这是一个过程。此过程会将用户更改为postfix
,然后调用java
- 另一个进程。
如果sudo
使用exec
(因此只有一个进程用于该命令),那么java
将能够运行它不应该运行的东西(因为java
1}}二进制文件将替换内存中的sudo
,因此拥有sudo
所拥有的所有权限,这可能是一个坏主意。
请注意,sudo
二进制文件不会执行任何操作:它只是等待java
终止,然后再进行自己的清理。
要理解的一个关键事项是sudo
不是魔术系统实用程序,它只是一个普通的应用程序,作为setuid
位。这意味着,允许sudo
二进制文件更改其运行时user-uid。看到这一点后,您就会开始了解sudo
的工作原理以及为什么会有两个流程。