ps 출력 또는 procfs에 랙업에 대한 명령줄 옵션이 표시되지 않음

ps 출력 또는 procfs에 랙업에 대한 명령줄 옵션이 표시되지 않음

아시다시피, 명령 실행을 위한 명령줄 런타임 인수를 얻으려면 ps -e또는 구문 분석을 수행하면 됩니다 /proc/<pid>/cmdline.

하지만 이 메서드가 경로만 있고 매개변수는 없는 명령만 반환하는 경우 문제가 발생합니다. 예를 들어:

$ rackup private_pub.ru -s thin -E production

Thin web server (v1.5.1 codename Straight Razor)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop

$ ps -e | grep rackup

16226 ttys001    0:02.19 /home/user/.rvm/gems/ruby-1.9.3-p429@gearup/
bin/rackup  

$ xargs -0 echo < /proc/16226/cmdline

/home/user/.rvm/gems/ruby-1.9.3-p429@gearup/bin/rackup

private_pub.ru이어진 논쟁은 없었다 .

rackup옵션을 "먹고" 보이지 않게 하는 것이 가능합니까 ps?

이 행동의 이유는 무엇입니까? 내 주요 문제는 ps또는 의 특정 매개변수를 사용하여 특정 프로시저를 찾는 것입니다 procfs.

출력은 다음과 같습니다strace -rf -e trace=process rackup

0.000000 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@global/bin/rackup", ["rackup", "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0
     0.003323 arch_prctl(ARCH_SET_FS, 0x7f1f1b1b1740) = 0
     0.001193 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@gearup/bin/ruby_noexec_wrapper", ["ruby_noexec_wrapper", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0
     0.002065 arch_prctl(ARCH_SET_FS, 0x7f04829a8740) = 0
     0.001028 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@gearup/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = -1 ENOENT (No such file or directory)
     0.000294 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@global/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = -1 ENOENT (No such file or directory)
     0.000286 execve("/home/user/.rvm/rubies/ruby-1.9.3-p385/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0
     0.005911 arch_prctl(ARCH_SET_FS, 0x7f4c84595740) = 0
     0.013703 clone(Process 9182 attached
child_stack=0x7f4c845c1fb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4c845c29d0, tls=0x7f4c845c2700, child_tidptr=0x7f4c845c29d0) = 9182

>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop

답변1

OS를 명시하지 않았으며 psOS에 따라 다릅니다(Linux에서는 배포판에 따라 다릅니다). Linux와 FreeBSD 모두 최소한 요구 사항을 준수합니다 /proc. ps -e출력 comm(잘린 "명령")만 준수하고 인수는 준수하지 않습니다.

Linux 또는 *BSD에서 시도해 보세요 ps.

ps axwwo "pid ppid uid comm args"

args는 필요할 수 있는 필드이며 이중 "w" 옵션을 사용하면 "무제한 너비" 출력이 가능합니다. 전체 경로는 사용 가능한 공간을 초과할 수 있으므로( ps프로세스당 한 줄을 선호하고 터미널 너비를 확인하세요) 전체 경로나 인수가 반드시 표시되지는 않습니다.

그러나 사용법이 /proc/xx/cmdline정확하며 전혀 논쟁의 여지가 없습니다.

두 번째 문제는 rackup실행 파일이 쉘 스크립트라는 사실로 인해 발생할 수 있습니다. 스크립트가 일시적이고 매개변수가 Ruby로 빨려 들어가는 것으로 추측됩니다 ARGV.

strace -rf -e trace=process rackup ...

무슨 일이 일어났는지 보세요.

-P랙업 이나 옵션을 사용하여 각 인스턴스의 PID 파일을 기록할 수 있어야 하며 --pid, 원하는 경우 특정 인스턴스를 모니터링하고 구별할 수 있습니다.

일반적으로 가장 좋은 도구는 이름 및/또는 매개변수로 프로세스를 식별하는 것 pgrep입니다pidof

답변2

당신은 확실히 읽기 시작해야합니다매뉴얼 페이지. 예는 man ps(온라인 매뉴얼 페이지):

-f     Do full-format listing. This option can be combined with many other UNIX-style options to add additional columns.  It also causes the command arguments to be printed.  When
       used with -L, the NLWP (number of threads) and LWP (thread ID) columns will be added.  See the c option, the format keyword args, and the format keyword comm.

그러니 달려보세요 ps -ef | grep rackup;-)

답변3

물론 프로그램은 해당 매개변수에 액세스(변경 및 삭제)할 수 있습니다. 이는 특히 사용자 이름, 비밀번호 및 기타 민감한 정보가 손상될 수 있는 경우 보안 기능으로 간주됩니다. 주소, 포트, 공유 메모리 키 및 기타 정보도 민감한 정보로 간주될 수 있습니다.

서버 데몬 및 기타 분기/실행 하위 프로세스도 처리 중에 매개변수를 제거할 수 있습니다.

관련 정보