ps: पूर्ण आदेश बहुत लंबा है


26

अच्छा दिन!

मैं 'ps' का उपयोग कमांड देखने के लिए करता हूं जो प्रक्रिया शुरू करता है। मुद्दा यह है कि कमांड बहुत लंबा है और 'पीएस' इसे पूरी तरह से नहीं दिखाता है।

उदाहरण: मैं 'ps -p 2755' कमांड का उपयोग करता हूं कम 'और निम्न आउटपुट है

  PID TTY      STAT   TIME COMMAND
2755 ?        Sl   305:05 /usr/java/jdk1.6.0_37/bin/java -Xms64m -Xmx512m -Dflume.monitoring.type=GANGLIA -Dflume.monitoring.hosts=prod.hostname.ru:8649 -cp /etc/flume-ng/conf/acrs-event:/usr/lib/flume-ng/lib/*:/etc/hadoop/conf:/usr/lib/hadoop/lib/activation-1.1.jar:/usr/lib/hadoop/lib/asm-3.2.jar:/usr/lib/hadoop/lib/avro-1.7.4.jar:/usr/lib/hadoop/lib/commons-beanutils-1.7.0.jar:/usr/lib/hadoop/lib/commons-beanutils-core-1.8.0.jar:/usr/lib/hadoop/lib/commons-cli-1.2.jar:/usr/lib/hadoop/lib/commons-codec-1.4.jar:/usr/lib/hadoop/lib/commons-collections-3.2.1.jar:/usr/lib/hadoop/lib/commons-compress-1.4.1.jar:/usr/lib/hadoop/lib/commons-configuration-1.6.jar:/usr/lib/hadoop/lib/commons-digester-1.8.jar:/usr/lib/hadoop/lib/commons-el-1.0.jar:/usr/lib/hadoop/lib/commons-httpclient-3.1.jar:/usr/lib/hadoop/lib/commons-io-2.1.jar:/usr/lib/hadoop/lib/commons-lang-2.5.jar:/usr/lib/hadoop/lib/commons-logging-1.1.1.jar:/usr/lib/hadoop/lib/commons-math-2.1.jar:/usr/lib/hadoop/lib/commons-net-3.1.jar:/usr/lib/hadoop/lib/guava-11.0.2.jar:/usr/lib/hadoop/lib/jackson-core-asl-1.8.8.jar:/usr/lib/hadoop/lib/jackson-jaxrs-1.8.8.jar:/usr/lib/hadoop/lib/jackson-mapper-asl-1.8.8.jar:/usr/lib/hadoop/lib/jackson-xc-1.8.8.jar:/usr/lib/hadoop/lib/jasper-compiler-5.5.23.jar:/usr/lib/hadoop/lib/jasper-runtime-5.5.23.jar:/usr/lib/hadoop/lib/jaxb-api-2.2.2.jar:/usr/lib/hadoop/lib/jaxb-impl-2.2.3-1.jar:/usr/lib/hadoop/lib/jersey-core-1.8.jar:/usr/lib/hadoop/lib/jersey-json-1.8.jar:/usr/lib/hadoop/lib/jersey-server-1.8.jar:/usr/lib/hadoop/lib/jets3t-0.6.1.jar:/usr/lib/hadoop/lib/jettison-1.1.jar:/usr/lib/hadoop/lib/jetty-6.1.26.cloudera.2.jar:/usr/lib/hadoop/lib/jetty-util-6.1.26.cloudera.2.jar:/usr/lib/hadoop/lib/jline-0.9.94.jar:/usr/lib/hadoop/lib/jsch-0.1.42.jar:/usr/lib/hadoop/lib/jsp-api-2.1.jar:/usr/lib/hadoop/lib/jsr305-1.3.9.jar:/usr/lib/hadoop/lib/junit-4.8.2.jar:/usr/lib/hadoop/lib/kfs-0.3.jar:/usr/lib/hadoop/lib/log4j-1.2.17.jar:/usr/lib/hadoop/lib/mockito-all-1.8.5.jar:/usr/lib/hadoop/lib/native:/usr/lib/hadoop/lib/paranamer-2.3.jar:/usr/lib/hadoop/lib/protobuf-java-2.4.0a.jar:/usr/lib/hadoop/lib/servlet-api-2.5.jar:/usr/lib/hadoop/lib/snappy-java-1.0.4.1.jar:/usr/lib/hadoop/lib/stax-api-1.0.1.jar:/usr/lib/hadoop/lib/xmlenc-0.52.jar:/usr/lib/hadoop/lib/xz-1.0.jar:/usr/lib/hadoop/lib/zookeeper-3.4.5-cdh4.3.0.jar:/usr/lib/hadoop/.//bin:/usr/lib/hadoop/.//cloudera:/usr/lib/hadoop/.//etc:/usr/lib/hadoop/.//hadoop-annotations-2.0.0-cdh4.3.0.jar:/usr/lib/hadoop/.//hadoop-annotations.jar:/usr/lib/hadoop/.//hadoop-auth-2.0.0-cdh4.3.0.jar:/usr/lib/hadoop/.//hadoop-auth.jar:/usr/lib/hadoop/.//hadoop-common-2.0.0-cdh4.3.0.jar:/usr/lib/hadoop/.//hadoop-common-2.0.0-cdh4.3.0-tests.jar:/usr/lib/hadoop/.//hadoop-common.jar:/usr/lib/hadoop/.//lib:/usr/lib/hadoop/.//libexec:/usr/lib/hadoop/.//sbin:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/asm-3.2.jar:/usr/lib/hadoop-hdfs/lib/commons-cli-1.2.jar:/usr/lib/hadoop-hdfs/lib/commons-codec-1.4.jar:/usr/lib/hadoop-hdfs/lib/commons-daemon-1.0.3.jar:/usr/lib/hadoop-hdfs/lib/commons-el-1.0.jar:/usr/lib/hadoop-hdfs/lib/commons-io-2.1.jar:/usr/lib/hadoop-hdfs/lib/commons-lang-2.5.jar:/usr/lib/hadoop-hdfs/lib/commons-logging-1.1.1.jar:/usr/lib/hadoop-hdfs/lib/guava-11.0.2.jar:/usr/lib/hadoop-hdfs/lib/jackson-core-asl-1.8.8.jar:/usr/lib/hadoop-hdfs/lib/jackson-mapper-asl-1.8.8.jar:/usr/lib/hadoop-hdfs/lib/jasper-runtime-5.5.23.jar:/usr/lib/hadoop-hdfs/lib/jersey-core-1.8.jar:/usr/lib/hadoop-hdfs/lib/jersey-server-1.8.jar:/usr/lib/hadoop-hdfs/lib/jetty-6.1.26.cloudera.2.jar:/usr/lib/hadoop-hdfs/lib/jetty-util-6.1.26.cloudera.2.jar:/usr/lib/hadoop-hdfs/lib/jline-0.9.94.jar:/usr/lib/hadoop-hdfs/lib/jsp-api-2.1.jar:/usr/lib/hadoop-hdfs/lib/jsr305-1.3.9.jar:/usr/lib/hadoop-hdfs/lib/log4j-1.2.17.jar:/usr/lib/hadoop-hdfs/lib/protobuf-java-2.4.0a.jar:/usr/lib/hadoop-hdfs/lib/servlet-api-2.5.jar:/usr/lib/hadoop-hdfs/lib/xmlenc-0.52.jar:/usr/lib/hadoop-hdfs/lib/zookeeper-3.4.5-cdh4.3.0.jar:/usr/lib/hadoop-hdfs/.//bin:/usr/lib/hadoop-hdfs/.//cloudera:/usr/lib/hadoop-hdfs/.//hadoop-hdfs-2.0.0-cdh4.3.0.jar:/usr/lib/hadoop-hdfs/.//hadoop-hdfs-2.0.

तो, कमांड लाइन बहुत लंबी है और कमांड मिड-वाक्यांश को रोकती है। मैं इसे पूरा कैसे देख सकता हूं?

जवाबों:


38

लिनक्स पर, साथ psसे procps(-ng):

ps -fwwp 2755

4.2 से पहले के लिनक्स संस्करणों में, यह अभी भी सीमित है (कर्नेल द्वारा ( /proc/2755/cmdline) से 4k तक) और आप इसे बताने या डिबगर का उपयोग करने की प्रक्रिया पूछकर इससे अधिक नहीं पा सकते हैं।

$ sh -c 'sleep 1000' $(seq 4000) &
[1] 31149
$ gdb -p $! /bin/sh
[...]
Attaching to program: /bin/dash, process 31149
[...]
(gdb) bt
#0  0x00007f40d11f40aa in wait4 () at ../sysdeps/unix/syscall-template.S:81
[...]
#7  0x00007f40d115c995 in __libc_start_main (main=0x4022c0, argc=4003, ubp_av=0x7fff5b9f5a88, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff5b9f5a78)
at libc-start.c:260
#8  0x00000000004024a5 in ?? ()
#9  0x00007fff5b9f5a78 in ?? ()
#10 0x0000000000000000 in ?? ()
(gdb) frame 7
#7  0x00007f40d115c995 in __libc_start_main (main=0x4022c0, argc=4003, ubp_av=0x7fff5b9f5a88, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff5b9f5a78)
at libc-start.c:260
(gdb) x/4003s *ubp_av
0x7fff5b9ff83e: "sh"
0x7fff5b9ff841: "-c"
0x7fff5b9ff844: "sleep 1000"
0x7fff5b9ff84f: "1"
0x7fff5b9ff851: "2"
[...]
0x7fff5ba04212: "3999"
0x7fff5ba04217: "4000"

5000 वर्णों तक 4 वें अर्ग को प्रिंट करने के लिए:

(gdb) set print elements 5000
(gdb) p ubp_av[3]

यदि आप कुछ गैर-दखल चाहते हैं, तो आप कोशिश कर सकते हैं और जानकारी प्राप्त कर सकते हैं /proc/2755/mem(ध्यान दें कि यदि यह kernel.yama.ptrace_scope0 पर सेट नहीं है, तो आपको उसके लिए सुपरयुसर अनुमतियों की आवश्यकता होगी)। यह नीचे मेरे लिए काम करता है (सभी तर्कों और पर्यावरण चर को प्रिंट करता है), लेकिन मुझे लगता है कि बहुत अधिक गारंटी नहीं है (त्रुटि और अप्रत्याशित इनपुट हैंडलिंग पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है):

$ perl -e '$p=shift;open MAPS, "/proc/$p/maps";
          ($m)=grep /\[stack\]/, <MAPS>;
          ($a,$b)=map hex, $m =~ /[\da-f]+/g;
          open MEM, "/proc/$p/mem" or die "open mem: $!";
          seek MEM,$a,0; read MEM, $c,$b-$a;
          print((split /\0{2,}/,$c)[-1])' "$!" | tr \\0 \\n | head
sh
-c
sleep 1000
1
2
3
4
5
6
7

( "$!"प्रक्रिया आईडी के साथ बदलें )। उपरोक्त इस तथ्य का उपयोग करता है कि लिनक्स द्वारा बताए गए तार argv[], envp[]और प्रक्रिया के ढेर के नीचे निष्पादित फ़ाइल नाम रखता है।

ऊपर दो या दो से अधिक लगातार NUL बाइट्स के दो सेट के बीच नीचे-सबसे स्ट्रिंग के लिए उस स्टैक में दिखता है। यह काम नहीं करता है अगर कोई भी तर्क या एनवी स्ट्रिंग खाली है, क्योंकि तब आपके पास उन एनजीवी या एनवीपी के बीच में 2 एनयूएल बाइट्स का एक क्रम होगा। इसके अलावा, हम नहीं जानते कि argv स्ट्रिंग्स कहाँ रुकते हैं और जहाँ एनवीपी शुरू होते हैं।

इसके लिए एक काम आसपास के argv[]( सामग्री) की वास्तविक सामग्री के लिए पीछे की ओर देखते हुए उस अनुमान को परिष्कृत करना होगा । यह नीचे i386 और amd64 आर्किटेक्चर पर कम से कम ELF के निष्पादन के लिए काम करता है:

perl -le '$p=shift;open MAPS, "/proc/$p/maps";
      ($m)=grep /\[stack\]/, <MAPS>;
      ($a,$b)=map hex, $m =~ /[\da-f]+/g;
      open MEM, "/proc/$p/mem" or die "open mem: $!";
      seek MEM,$a,0; read MEM, $c,$b-$a;
      $c =~ /.*\0\0\K[^\0].*\0[^\0]*$/s;
      @a=unpack"L!*",substr$c,0,$-[0];
      for ($i = $#a; $i >=0 && $a[$i] != $a+$-[0];$i--) {}
      for ($i--; $i >= 0 && ($a[$i]>$a || $a[$i]==0); $i--) {}
      $argc=$a[$i++];
      print for unpack"(Z*)$argc",substr$c,$a[$i]-$a;' "$!"

असल में, यह ऊपर के रूप में ही है, लेकिन एक बार यह की पहली स्ट्रिंग में पाया गया है argv[](या कम से कम से एक argv[]या envp[]तार अगर वहाँ खाली कर रहे हैं), यह अपने पता जानता है, तो इसके लिए ढेर के शीर्ष बाकी हिस्सों में पिछड़े लग रहा है उसी मान के साथ एक सूचक। तब तक पीछे की ओर देखता रहता है जब तक कि यह एक संख्या नहीं मिलती है जो उन लोगों के लिए एक संकेतक नहीं हो सकता है, और यह है argc। फिर अगला पूर्णांक है argv[0]। और जानना argv[0]और argc, यह तर्कों की सूची प्रदर्शित कर सकता है।

यदि प्रक्रिया argv[]संभवतया कुछ एनयूएल सीमांकक को ओवरराइड करने के लिए लिखी गई है या यदि argc0 है ( argcआमतौर पर कम से कम 1 शामिल करने के लिए argv[0]), लेकिन सामान्य मामले में कम से कम ईएलएफ निष्पादन के लिए काम करना चाहिए।

4.2 और नए में, /proc/<pid>/cmdlineअब छंटनी नहीं हुई है, लेकिन psअपने आप में अधिकतम प्रदर्शन चौड़ाई 128K है।


आप डिबगर के बारे में अधिक बता सकते हैं, कृपया? मैं इसे रनिंग प्रक्रिया में कैसे संलग्न कर सकता हूं?
वी। अरीत्युखोव

1
@ V.Artyukhov मुझे लगता है कि यह क्या -p $!करता है ( $!सबसे हाल ही में शुरू की गई प्रक्रिया की पीआईडी ​​है, जिसे तब से देखा जा सकता है जब तक gdb का आह्वान नहीं किया जाता तब भी यही चल रहा होगा)।
बजे एक CVn

हां, लंबी कमांड को भी लंबे समय तक कमांड के साथ लड़ें। चुटकुले एक तरफ, एक अच्छी व्याख्या और प्रलेखन के साथ उत्तर के लिए +1।
स्टेन स्ट्रोम


5

लिनक्स कर्नेल 4.2 और नए में, /proc/<pid>/cmdlineअब छोटा नहीं है और निम्नलिखित अच्छी तरह से काम करता है:

xargs -0 printf '%s\n' < /proc/2755/cmdline
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.