PS: সম্পূর্ণ কমান্ডটি অনেক দীর্ঘ


26

শুভ দিন!

প্রসেস শুরু হওয়া কমান্ড দেখতে আমি 'পিএস' ব্যবহার করি। সমস্যাটি হ'ল কমান্ডটি অত্যন্ত দীর্ঘ এবং 'পিএস' এটি পুরোপুরি প্রদর্শন করে না।

উদাহরণ: আমি '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

লিনাক্স সংস্করণে ৪.২ এর আগে এটি এখনও সীমাবদ্ধ ছিল (কার্নেল দ্বারা /proc/2755/cmdline) থেকে 4 কে) এবং আপনাকে প্রক্রিয়াটি আপনাকে বলার জন্য বা একটি ডিবাগার ব্যবহার না করে আপনি আরও কিছু পেতে পারেন না।

$ 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[](পয়েন্টারগুলি) এর প্রকৃত সামগ্রীর জন্য পিছনের দিকে তাকিয়ে সেই হিউরিস্টিকটি সংশোধন করা । এটি নীচে 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
@ ভি.আর্টিউখভ আমার ধারণা, এটিই কি -p $!করে ( $!খুব সম্প্রতি শুরু হওয়া প্রক্রিয়ার পিআইডি, যেহেতু এটি ব্যাকগ্রাউন্ড হয়েছে তখনও জিডিবি আহ্বান করার পরে চলবে)।
একটি সিভিএন

হ্যাঁ, লম্বা কমান্ডগুলি আরও দীর্ঘ কমান্ডের সাথে লড়াই করুন। একটি ভাল ব্যাখ্যা এবং ডকুমেন্টেশন সহ উত্তরের জন্য +1 জোকস।
স্টান স্ট্রাম


5

লিনাক্স কার্নেল ৪.২ এবং আরও নতুনতে, /proc/<pid>/cmdlineআর কাটা হয় না এবং নিম্নলিখিতগুলি দুর্দান্তভাবে কাজ করে:

xargs -0 printf '%s\n' < /proc/2755/cmdline
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.