문제

ClassPaths가 매우 긴 Java 앱의 경우 PS를 사용할 때 ARG 목록의 끝 근처에 지정된 메인 클래스를 볼 수 없습니다. 나는 이것이 내 우분투 시스템의 크기 제한/proc/pid/cmdline에서 비롯된 것 같습니다. 이 한도를 어떻게 늘릴 수 있습니까?

도움이 되었습니까?

해결책

이 동적으로 변경할 수 없으며, 제한은 커널에서 FS/Proc/Base.c에서 Page_Size로 하드 코딩됩니다.

 274        int res = 0;
 275        unsigned int len;
 276        struct mm_struct *mm = get_task_mm(task);
 277        if (!mm)
 278                goto out;
 279        if (!mm->arg_end)
 280                goto out_mm;    /* Shh! No looking before we're done */
 281
 282        len = mm->arg_end - mm->arg_start;
 283 
 284        if (len > PAGE_SIZE)
 285                len = PAGE_SIZE;
 286 
 287        res = access_process_vm(task, mm->arg_start, buffer, len, 0);

다른 팁

Java 프로세스를보고 있습니다 JPS 매우 유용합니다.

이것은 당신에게 메인 클래스와 JVM Args를 줄 것입니다 :

jps -vl | grep <pid>

PS의 4096 캐릭터 명령 줄 인수 제한을 일시적으로 얻습니다 (또는 오히려/proc/pid/cmdline)는 작은 스크립트를 사용하여 Java 명령을 대체하는 것입니다.

개발 중에는 항상 SUN에서 포장되지 않은 JDK 버전을 사용하며 Linux 또는 Windows (예 : BIN과 RPM.BIN을 다운로드하더라도 설치된 JRE 또는 JDK를 OS의 JRE 또는 JDK를 사용하지 않습니다. 기본 Java 설치에 대한 스크립트를 변경하는 것이 좋습니다 (예 : 업데이트를 중단하거나 덮어 쓰거나 문제를 일으키거나 문제를 일으킬 수 있기 때문에 ...)

따라서 Java 명령이 /x/jdks/jdk1.6.0_16_x32/bin/java에 있다고 가정합니다

먼저 실제 바이너리를 멀리 이동하십시오.

mv /x/jdks/jdk1.6.0_16_x32/bin/java /x/jdks/jdk1.6.0_16_x32/bin/java.orig

그런 다음 스크립트 /x/jdks/jdk1.6.0_16_x32/bin/java와 같이 :

    #!/bin/bash

    echo "$@" > /tmp/java.$$.cmdline
   /x/jdks/jdk1.6.0_16_x32/bin/java.orig $@

그런 다음 스크립트를 실행할 수있게하십시오

chmod a+x /x/jdks/jdk1.6.0_16_x32/bin/java

위의 복사 및 붙여 넣기의 경우 /x/jdks/jdk1.6.0_16_x32/bin/java 및 #!/bin/bash에 추가 공간이 없는지 확인해야합니다.

전체 명령 줄은 예를 들어 /tmp/java.26835.cmdline으로 끝납니다. 여기서 26835는 쉘 스크립트의 PID입니다. 명령 줄 인수 수에는 일부 쉘 제한이 있다고 생각합니다. 기억할 수 없지만 아마도 64k 문자 일 수 있습니다.

스크립트를 변경하여 끝에서 /tmp/java.process_id.cmdline에서 명령 줄 텍스트를 제거 할 수 있습니다.

CommandLine을 얻은 후에는 항상 스크립트를 "Java.Script"및 실제 바이너리 Java.orig를 Java로 복사 (CP -A)와 같은 것으로 옮깁니다. 4K 제한을 누르면 스크립트 만 사용합니다.

탈출 된 캐릭터와 길이나 그와 같은 공간에 문제가있을 수 있지만 나에게 잘 작동합니다.

당신이 사용할 수있는 jconsole 모든 길이 제한없이 원래 명령 줄에 액세스하려면.

이 한계가 제거 된 최신 Linux 배포판을 사용할 수 있습니다 (예 : Rhel 6.8 이상)

"PS 명령의/proc/pid/cmdline 파일 길이 제한은 이전에 커널에서 4096 자로 하드 코딩되었습니다.이 업데이트는/proc/pid/cmdline의 길이가 무제한인지 확인하여 특히 나열된 프로세스에 유용합니다. 긴 명령 줄 인수와 함께. (BZ#1100069) "

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/6.8_release_notes/new_features_kernel.html

메인 클래스가 얻은 명령 줄을 검사하는 데 관심이있는 Java 기반 프로그램의 경우 다음을 실행할 수 있습니다.

jps -m

실제로/proc/$ pid/cmdline에서 잘린 인수를보고 있다면 실제로 OS에서 지원하는 최대 인수 길이를 초과하고 있다고 확신합니다. 내가 알 수있는 한 Linux에서 크기는 메모리 페이지 크기로 제한됩니다. 보다 "PS WW"길이 제한 참조.

주변을 돌아 다니는 유일한 방법은 커널을 다시 컴파일하는 것입니다. 이 문제를 해결하기 위해 멀리가는 데 관심이 있다면이 게시물이 유용 할 수 있습니다. "인수 목록이 너무 길다": 인수와 한계를 넘어서

추가 참조 :
Arg_max, 새로운 프로세스에 대한 최대 인수 길이

아마도 'w'매개 변수는 당신이 원하는 것일 것입니다. 더 큰 출력을 위해 두 개의 'w'를 추가하십시오. PS는 터미널의 선 너비를 무시하도록 지시합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top