Java 프로그램은 어떻게 자체 프로세스 ID를 얻을 수 있습니까?
Java 프로세스의 ID를 얻으려면 어떻게 해야 하나요?
플랫폼에 의존하는 해커가 몇 가지 있다는 것은 알지만, 좀 더 일반적인 솔루션을 선호합니다.
모든 jvm 구현에서 작동하도록 보장할 수 있는 플랫폼에 독립적인 방법은 없습니다. ManagementFactory.getRuntimeMXBean().getName()
는 최적의(가장 가까운) 솔루션처럼 보이며 일반적으로 PID가 포함되어 있습니다.이것은 짧고, 아마도 널리 사용되는 모든 구현에서 사용할 수 있을 것입니다.
+Windows와 같은 합니다."12345@hostname"
)12345
프로세스 ID가 됩니다).단, 문서에 따르면 이 값에 대한 보장은 없습니다.
실행 중인 Java 가상 시스템을 나타내는 이름을 반환합니다.반환되는 이름 문자열은 임의의 문자열일 수 있으며 Java 가상 시스템 구현에서는 플랫폼별 유용한 정보를 반환된 이름 문자열에 포함하도록 선택할 수 있습니다.실행 중인 각 가상 시스템의 이름이 다를 수 있습니다.
Java 9에서는 새로운 프로세스 API를 사용할 수 있습니다.
long pid = ProcessHandle.current().pid();
유고 인민군이 필요하겠군유감스럽게도 현재 프로세스 ID를 취득할 수 있는 일반적인 JNA API는 아직 없지만 각 플랫폼은 매우 간단합니다.
창문들
있어야 합니다.jna-platform.jar
다음아까,아까다,아까다.
int pid = Kernel32.INSTANCE.GetCurrentProcessId();
유닉스
선언:
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int getpid ();
}
그 후, 다음과 같이 입력합니다.
int pid = CLibrary.INSTANCE.getpid();
자바 9
Java 9에서는 새로운 프로세스 API를 사용하여 현재 프로세스 ID를 얻을 수 있습니다.먼저 현재 프로세스에 대한 핸들을 잡은 다음 PID를 쿼리합니다.
long pid = ProcessHandle.current().pid();
모든 VM에서 동작하지는 않지만 Linux와 Windows 모두에서 동작하는 백도어 방법을 다음에 나타냅니다(원래의 예).
java.lang.management.RuntimeMXBean runtime =
java.lang.management.ManagementFactory.getRuntimeMXBean();
java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
sun.management.VMManagement mgmt =
(sun.management.VMManagement) jvm.get(runtime);
java.lang.reflect.Method pid_method =
mgmt.getClass().getDeclaredMethod("getProcessId");
pid_method.setAccessible(true);
int pid = (Integer) pid_method.invoke(mgmt);
Sigar. 매우 광범위한 API를 사용해 보십시오.Apache 2 라이선스
private Sigar sigar;
public synchronized Sigar getSigar() {
if (sigar == null) {
sigar = new Sigar();
}
return sigar;
}
public synchronized void forceRelease() {
if (sigar != null) {
sigar.close();
sigar = null;
}
}
public long getPid() {
return getSigar().getPid();
}
는 PID에서 .java.lang.management.ManagementFactory
:
private static String getProcessId(final String fallback) {
// Note: may fail in some JVM implementations
// therefore fallback has to be provided
// something like '<pid>@<hostname>', at least in SUN / Oracle JVMs
final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
final int index = jvmName.indexOf('@');
if (index < 1) {
// part before '@' empty (index = 0) / '@' not found (index = -1)
return fallback;
}
try {
return Long.toString(Long.parseLong(jvmName.substring(0, index)));
} catch (NumberFormatException e) {
// ignore
}
return fallback;
}
전화하세요.getProcessId("<PID>")
를 들어예를 들어.
이전 JVM의 경우 Linux에서...
private static String getPid() throws IOException {
byte[] bo = new byte[256];
InputStream is = new FileInputStream("/proc/self/stat");
is.read(bo);
for (int i = 0; i < bo.length; i++) {
if ((bo[i] < '0') || (bo[i] > '9')) {
return new String(bo, 0, i);
}
}
return "-1";
}
Java 9에서는 프로세스의 네이티브 ID를 반환하는 Process.getPid() 메서드가 있습니다.
public abstract class Process {
...
public long getPid();
}
를 하려면 , 「Java」ID 를 합니다.ProcessHandle
★★★★★★★★★★★★★★★★★★:
System.out.println(ProcessHandle.current().pid());
GitHub에서 JavaSysMon 프로젝트를 확인하실 수 있습니다.프로세스 ID 및 기타 많은 것(CPU 사용량, 메모리 사용량) 크로스 플랫폼(현재 Windows, Mac OSX, Linux 및 Solaris)을 제공합니다.
Scala의 경우:
import sys.process._
val pid: Long = Seq("sh", "-c", "echo $PPID").!!.trim.toLong
Java 9가 출시될 때까지 Unix 시스템에서 해결 방법을 제공합니다.(Java에 대한 질문이었지만 Scala에 대한 질문이 없기 때문에 같은 질문에 부딪힐 수 있는 Scala 사용자에게 이 질문을 남겨두고 싶었습니다.
java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]
완전성을 위해 Spring Boot에는
String jvmName = ManagementFactory.getRuntimeMXBean().getName();
return jvmName.split("@")[0];
솔루션.정수가 필요한 경우, 이는 원라이너로 요약할 수 있습니다.
int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
이미 스프링 부트를 사용하고 있는 경우는 org.springframework.boot를 사용할 수 있습니다.응용 프로그램 Pid
ApplicationPid pid = new ApplicationPid();
pid.toString();
toString() 메서드는 pid 또는 '--을 출력합니다.?'.
Management Factory를 사용한 경고는 이미 다른 답변에서 설명되어 있습니다.
public static long getPID() {
String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
if (processName != null && processName.length() > 0) {
try {
return Long.parseLong(processName.split("@")[0]);
}
catch (Exception e) {
return 0;
}
}
return 0;
}
저는 다른 솔루션과 함께 이것을 추가합니다.
10을 10을 가져옵니다.process id
final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
final long pid = runtime.getPid();
out.println("Process ID is '" + pid);
최근에 발견한 것은 다음과 같은 시스템 속성이 있다는 것입니다.sun.java.launcher.pid
【Linux】【Linux】【Linux】【Linux】【Linux】【Linux】【Linux】키로 했습니다. 은 그것을 이다. 만약 할 수 .JMX bean
.
어디서 정보를 찾느냐에 따라 다릅니다.
콘솔에서 정보를 검색할 경우 jps 명령을 사용할 수 있습니다.이 명령어는 Unix ps 명령어와 유사한 출력을 제공하며 1.5로 생각하기 때문에 JDK와 함께 제공됩니다.
프로세스에서 RuntimeMXBean(Wouter Coekaerts가 말한 대로)을 선택하는 것이 가장 좋습니다.Sun JDK 1.6 u7을 사용한 Windows의 getName() 출력은 [PROCESS_ID]@[MACHINE_NAME] 형식입니다.단, jps를 실행하여 그 결과를 해석할 수 있습니다.
String jps = [JDK HOME] + "\\bin\\jps.exe";
Process p = Runtime.getRuntime().exec(jps);
옵션을 지정하지 않고 실행할 경우 출력은 프로세스 ID 뒤에 이름을 붙여야 합니다.
JConsole, JPS, VisualVM, VisualVM.다음 수업들을 통해sun.jvmstat.monitor.*
「」에서 「」로tool.jar
.
package my.code.a003.process;
import sun.jvmstat.monitor.HostIdentifier;
import sun.jvmstat.monitor.MonitorException;
import sun.jvmstat.monitor.MonitoredHost;
import sun.jvmstat.monitor.MonitoredVm;
import sun.jvmstat.monitor.MonitoredVmUtil;
import sun.jvmstat.monitor.VmIdentifier;
public class GetOwnPid {
public static void main(String[] args) {
new GetOwnPid().run();
}
public void run() {
System.out.println(getPid(this.getClass()));
}
public Integer getPid(Class<?> mainClass) {
MonitoredHost monitoredHost;
Set<Integer> activeVmPids;
try {
monitoredHost = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
activeVmPids = monitoredHost.activeVms();
MonitoredVm mvm = null;
for (Integer vmPid : activeVmPids) {
try {
mvm = monitoredHost.getMonitoredVm(new VmIdentifier(vmPid.toString()));
String mvmMainClass = MonitoredVmUtil.mainClass(mvm, true);
if (mainClass.getName().equals(mvmMainClass)) {
return vmPid;
}
} finally {
if (mvm != null) {
mvm.detach();
}
}
}
} catch (java.net.URISyntaxException e) {
throw new InternalError(e.getMessage());
} catch (MonitorException e) {
throw new InternalError(e.getMessage());
}
return null;
}
}
몇 가지 단점이 있습니다.
tool.jar
이지만 JRE는 Oracle JDK는 JRE가 아닙니다.- 을얻
tool.jar
하는 것은 .Maven repo Maven은 Maven repo로 설정합니다. tool.jar
의존형되어 있기 할 수 .- JVM 앱을 실행하는 모든(로컬)이 "모니터블"이라는 가정 하에 실행됩니다.Java 6부터는 일반적으로 모든 앱이 해당됩니다(적극적으로 반대 구성을 하지 않는 한).
- Java 6+에서만 동작할 수 있습니다.
- Eclipse는 메인 클래스를 공개하지 않기 때문에 MonitoredVmUtil에서 Eclipse PID가 쉽게 버그되지 않습니다.
업데이트: JPS가 이 방법으로 사용하는 것을 재확인했습니다.이것은 Jvmstat 라이브러리(tool.jar의 일부)입니다.따라서 JPS를 외부 프로세스로 호출할 필요가 없습니다.예시와 같이 Jvmstat 라이브러리를 직접 호출합니다.이 방법으로 localhost에서 실행되는 모든 JVM 목록을 가져올 수 있습니다.JPS 소스 코드 참조:
Apache 2.0 라이선스에 대한 Ashwin Jayaprakash의 답변(+1)을 기반으로 합니다.SIGAR
현재 프로세스의 PID만을 취득하기 위해 사용하는 방법은 다음과 같습니다.
import org.hyperic.sigar.Sigar;
Sigar sigar = new Sigar();
long pid = sigar.getPid();
sigar.close();
일부 플랫폼에서는 동작하지 않지만 Linux, Windows, OS X 및 여기에 기재된 다양한 Unix 플랫폼에서는 동작합니다.
오래된 스레드인 것은 알지만 PID를 취득하기 위한 API(실행시 Java 프로세스의 다른 조작도 포함)가 JDK 9의 프로세스 클래스에 추가되고 있는 것을 호출하고 싶습니다.http://openjdk.java.net/jeps/102
시도해 보세요getpid()
JNR-Posix에 있습니다.
libc에서 getpid()를 호출하는 Windows POSIX 래퍼가 있습니다.
엣지 케이스가 될 수 있는 솔루션을 찾아 Windows 10 이외의 OS에서는 사용해 본 적이 없습니다만, 주목할 필요가 있다고 생각합니다.
J2V8 및 nodejs를 사용하는 경우 Java 프로세스의 pid를 반환하는 간단한 javascript 함수를 실행할 수 있습니다.
다음은 예를 제시하겠습니다.
public static void main(String[] args) {
NodeJS nodeJS = NodeJS.createNodeJS();
int pid = nodeJS.getRuntime().executeIntegerScript("process.pid;\n");
System.out.println(pid);
nodeJS.release();
}
저의 솔루션은 다음과 같습니다.
public static boolean isPIDInUse(int pid) {
try {
String s = null;
int java_pid;
RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
java_pid = Integer.parseInt(rt.getName().substring(0, rt.getName().indexOf("@")));
if (java_pid == pid) {
System.out.println("In Use\n");
return true;
}
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
return false;
}
이것은 제가 비슷한 요구를 했을 때 사용했던 것입니다.이것에 의해 Java 프로세스의 PID가 올바르게 결정됩니다.Java 코드에 의해 사전 정의된 포트 번호로 서버가 생성된 후 OS 명령을 실행하여 포트에서 PID 수신을 확인합니다.Linux의 경우
netstat -tupln | grep portNumber
언급URL : https://stackoverflow.com/questions/35842/how-can-a-java-program-get-its-own-process-id
'programing' 카테고리의 다른 글
Vue2 리플릿 맵이 BoostrapVue 모달에 올바르게 표시되지 않음 (0) | 2022.07.03 |
---|---|
Vuex getter가 상태 변경에 반응하지 않음 (0) | 2022.07.03 |
Vuex: 브라우저 새로 고침 시 상태 일부 유지 (0) | 2022.07.03 |
JUnit 4에서의 테스트 조건 무시 (0) | 2022.07.03 |
Retrofit 라이브러리에서 시간 초과를 설정하는 방법 (0) | 2022.07.03 |