/proc/pid/cmdline 4096 바이트 한계를 어떻게 늘리나요?
문제
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);
다른 팁
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) "
메인 클래스가 얻은 명령 줄을 검사하는 데 관심이있는 Java 기반 프로그램의 경우 다음을 실행할 수 있습니다.
jps -m
실제로/proc/$ pid/cmdline에서 잘린 인수를보고 있다면 실제로 OS에서 지원하는 최대 인수 길이를 초과하고 있다고 확신합니다. 내가 알 수있는 한 Linux에서 크기는 메모리 페이지 크기로 제한됩니다. 보다 "PS WW"길이 제한 참조.
주변을 돌아 다니는 유일한 방법은 커널을 다시 컴파일하는 것입니다. 이 문제를 해결하기 위해 멀리가는 데 관심이 있다면이 게시물이 유용 할 수 있습니다. "인수 목록이 너무 길다": 인수와 한계를 넘어서
추가 참조 :
Arg_max, 새로운 프로세스에 대한 최대 인수 길이
아마도 'w'매개 변수는 당신이 원하는 것일 것입니다. 더 큰 출력을 위해 두 개의 'w'를 추가하십시오. PS는 터미널의 선 너비를 무시하도록 지시합니다.