Unix/Linux 시스템의 프로세스에 전체 명령줄 인수를 전달하는 방법은 무엇입니까? [복사]

Unix/Linux 시스템의 프로세스에 전체 명령줄 인수를 전달하는 방법은 무엇입니까? [복사]

전체 명령줄 인수를 프로세스에 전달하는 안정적인 방법을 찾고 있습니다.매우 긴.

이해합니다 . ps -f -p <pid>그리고 /proc/<pid>/cmdline둘 다 보통 그 일을 합니다. 문제는 이 두 가지 모두 명령줄 인수를 4096자로 자르는 것 같고 인수가 더 길다는 xargs --show-limits것을 알고 있습니다(이것은 Java 애플리케이션이고 출력은 클래스 경로 문자열 중간에서 잘립니다). 내 시스템 최대 2094184개의 매개변수 길이가 허용됩니다.

이를 수행할 수 있는 방법이 있습니까?

업데이트: 이전에 경로에 배치한 래퍼를 만들고 동일한 인수로 올바른 바이너리를 호출하기 전에 인수를 파일에 기록하여 전체 명령줄 인수 문자열을 얻을 수 있었습니다.

#!/bin/bash

file=/tmp/commandtrap-$$.log

/usr/bin/echo "$@" >$file
/usr/lib/jvm/java-7-openjdk/jre/bin/java "$@"

그러나 이는 프로세스를 중지하고 실행할 수 있는 경우에만 작동하는 추악한 해결 방법입니다.

이상적으로는 실행 중인 프로세스를 종료하지 않고(또는 어떤 방식으로든 방해하지 않고) 전체 명령을 얻을 수 있는 방법이 있어야 합니다.

답변1

일반적으로 방법이 없다고 생각합니다. 운영 체제별 방법이 있을 수 있습니다. Unix/Linux에 대해 이야기하고 계시지만 특정 운영 체제를 위한 솔루션에 관심이 있으십니까?

예를 들어, Solaris는 프로세스 매개변수를 두 위치에 저장합니다. 하나는 커널의 프로세스와 관련된 불변 버퍼입니다. 하지만 커널 버퍼이기 때문에 길이가 제한되어 있고 명령줄이 잘린 버전일 수도 있습니다.

또 다른 위치는 프로세스 자체의 ARGV[]입니다. 쿼리할 수 있으며(예: 를 통해 pargs) 요약되지 않은 콘텐츠를 반환합니다. 그러나 ARGV는 프로세스 메모리의 일부이므로 언제든지 수정할 수 있습니다. 내용은 프로세스를 시작한 명령줄과 다를 수 있습니다.

후속 사용자가 원래 명령줄을 찾을 것이라는 보장은 없습니다.


방금 비슷한 질문에 대한 Stéphane Chazelas의 답변을 찾았습니다.ps: 전체 명령이 너무 깁니다.

x86 ELF 바이너리에서 ARGV[]를 디코딩하려고 시도하는 메서드가 포함된 것 같지만 테스트 케이스에서는 데이터를 가져올 수 없습니다. 이유는 모르겠습니다. 하지만 기술은 합리적인 것 같습니다.

관련 정보