কিভাবে একটি প্রক্রিয়া থেকে পুরো কমান্ড লাইন পেতে?


43

আমি কীভাবে চলমান প্রক্রিয়াটির নামটি ব্যবহার করে কমান্ড আর্গুমেন্ট বা পুরো কমান্ড লাইন পেতে পারি?

উদাহরণস্বরূপ এই প্রক্রিয়া:

# ps
PID   USER     TIME   COMMAND
 1452 root       0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid

এবং আমি যা চাই তা /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pidবা যুক্তি। আমি প্রক্রিয়াটির নাম জানি এবং এর যুক্তিগুলি চাই। আমি স্লিটাজ-এ ব্যাসিবক্স ব্যবহার করছি।


আপনি কি আউটপুটটি প্রক্রিয়া করতে চান ps(প্রস্তাবিত নয়) বা আপনি কোনও বিকল্প কমান্ডের সন্ধান করছেন psযা আপনাকে আউটপুট দেবে? psআউটপুট একাধিক লাইন দেয় যখন কি করা প্রয়োজন ? সব / প্রথম / শেষ প্রিন্ট?
অ্যান্থন

1
আপনি কোন অপারেটিং সিস্টেম ব্যবহার করেন?
সাইরাস

আমি আমার প্রশ্ন সম্পাদনা করেছি। আমি প্রক্রিয়াটির নাম জানি এবং এর যুক্তিগুলি চাই। আমি স্লিটাজ (মিনিমালিস্টিক লিনাক্স) ব্যাসিবক্স সহ ব্যবহার করছি।
মাইকেল

@ মিশেল আপনি @ জন উত্তর অনুসারে argপছন্দ commandকরেছেন ?
পান্ড্যা

হ্যাঁ তবে কীভাবে এটিকে ভেরিয়েবল লিখবেন? আমি দুটি কমান্ডের কথা ভাবি: PID = pidof <process name>PS -o pid, args | grep $ PID | tr -s "" | কাট-ডি "" -f 2 তবে এইভাবে আমি একটি ভেরিয়েবলটিতে আরোগুলি পাই না
মাইকেল

উত্তর:


54

আপনি -oনিজের আউটপুট ফর্ম্যাটটি নির্দিষ্ট করতে স্যুইচটি ব্যবহার করতে পারেন :

$ ps -eo args

থেকে man পৃষ্ঠা :

স্ট্রিং হিসাবে এর সমস্ত আর্গুমেন্ট সহ কমান্ড। যুক্তিগুলির পরিবর্তনগুলি প্রদর্শিত হতে পারে। [...]

আপনি -pএকটি নির্দিষ্ট পিআইডি নির্বাচন করতে স্যুইচটিও ব্যবহার করতে পারেন:

$ ps -p [PID] -o args

pidofপ্রসেসের নাম থেকে পিআইডি-তে স্যুইচ করতেও ব্যবহার করা যেতে পারে, তাই -pকোনও নাম ব্যবহারের অনুমতি দেয় :

$ ps -p $(pidof dhcpcd) -o args

অবশ্যই, আপনি এটির জন্যও ব্যবহার করতে পারেন grep(এই ক্ষেত্রে আপনাকে অবশ্যই -eস্যুইচটি যুক্ত করতে হবে):

$ ps -eo args | grep dhcpcd | head -n -1

জিএনইউ পিএস আপনাকে হেডারগুলি সরাতেও অনুমতি দেবে (অবশ্যই, এটি ব্যবহার করার সময় এটি অপ্রয়োজনীয় grep):

$ ps -p $(pidof dhcpcd) -o args --no-headers

অন্যান্য সিস্টেমে আপনি AWK বা সেডে পাইপ করতে পারেন:

$ ps -p $(pidof dhcpcd) -o args | awk 'NR > 1'
$ ps -p $(pidof dhcpcd) -o args | sed 1d

সম্পাদনা করুন: আপনি যদি এই লাইনটি একটি ভেরিয়েবলের মধ্যে ধরতে চান তবে $(...)যথারীতি কেবল ব্যবহার করুন :

$ CMDLINE=$(ps -p $(pidof dhcpcd) -o args --no-headers)

বা সাথে grep:

$ CMDLINE=$(ps -eo args | grep dhcpcd | head -n -1)

প্রতিস্থাপন @Michael argsসঙ্গে command(অথবা cmd)।
পান্ড্য

@Pandya উভয় cmdএবং commandথেকে alias লেখা হয় args, এই সম্ভবত অপ্রয়োজনীয়।
জন ডব্লিউ এইচ স্মিথ

ব্যাসিবক্স ব্যবহার করে আমার কাছে একটি -p বিকল্প নেই: ব্যবহার: পিএস [-ও সিওএল 1, সিওএল 2 = হেডার] [-টি]
মাইকেল

আপনি এই ব্যবহার করতে grepলাইন আপনি আসলে করতে আগ্রহী হন ধরা: ps -eo args | grep dhcpcd | head -n -1। আমি আমার উত্তর সম্পাদনা করেছি।
জন ডব্লিউ এইচ স্মিথ

ওহ, এটি দেখতে দুর্দান্ত দেখাচ্ছে: PS -o আরোগুলি | গ্রেপ <প্রক্রিয়া নাম> | শিরোনাম -n 1
মাইকেল 13

12

এরকম কিছু চেষ্টা করুন:

(উদাহরণস্বরূপ আমার রাউটারগুলির একটিতে ওপেনআরটিতে ব্যস্তবক্স থেকে আউটপুট)

root@ap8:~# xargs -0 printf '%s\n' </proc/991/cmdline
/usr/sbin/uhttpd
-f
-h
/www
-r
ap8
-x
/cgi-bin
-u
/ubus
-t
60
-T
30
-k
20
-A
1
-n
3
-N
100
-R
-p
0.0.0.0:80
-p
[::]:80

/proc/$PID/cmdline$PIDএকের পর এক সি-ইশ স্ট্রিংয়ের মতো প্রক্রিয়া যুক্তি যুক্ত করে। প্রতিটি স্ট্রিং শূন্য হয়।

কিছু আর্গুমেন্ট বা বিকল্পগুলির চারপাশে উদ্ধৃতিগুলি শেল স্টাফ। আপনাকে যে রেখাগুলি প্রদর্শিত হচ্ছে সেদিকে আরও নজর দিতে হবে এবং যেখানে শেলের জন্য বিশেষ অর্থ সহ ফাঁকা স্থান বা অন্যান্য অক্ষর ব্যবহৃত হয়। এই লাইনগুলিকে আবার একটি কমান্ড লাইনে যোগদান করার সময় আপনাকে কোনওরকম সেই অক্ষর (গুলি) বা সম্পূর্ণ যুক্তি উদ্ধৃত করতে হবে।


1
tr "\0" " " </proc/991/cmdline
সাইরাস

@ সাইরাস: আপনি তখন সংলগ্ন পৃথক পৃথক আরোগুলি থেকে স্পেসের সংলগ্ন আরোগিকে আলাদা করতে পারবেন না। শূন্য বাইটকে একটি স্থান দিয়ে প্রতিস্থাপন করে আপনি তথ্য নষ্ট করেন।
ইয়েতি

1
আমি \0be bad এর প্রতিস্থাপনকে খারাপ বলে সম্মত করি, তবে আমি এর tr '\0' '\n' < /proc/$foo/cmdlineচেয়ে কিছুটা সহজ বলে মনে করি xargs
প্যাট্রিক

printfআউটপুটে কোট যোগ করা সহজ করে তোলে, নতুন লাইনের পরিবর্তে একটি স্থান সন্নিবেশ করানো এবং এ জাতীয়। আরও প্রসেসিং যুক্ত করার চিন্তা করার সময়, পথটি printfএকটি ভাল শুরু।
ইয়েতি

12

পদ্ধতি # 1 - পিএস ব্যবহার করে

আপনি ব্যবহার করতে পারে ps -eaf | grep 1234

উদাহরণ

$ ps -eaf | grep 28865
saml     28865  9661  0 03:06 pts/2    00:00:00 bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done
saml     28866 28865  0 03:06 pts/2    00:00:00 sleep 10000

উল্লেখ্য: busybox এর psঅন্তর্ভুক্ত নয় -eafসুইচ হিসাবে একটি টিপিক্যাল থেকে উপরে দেখানো psযে অধিকাংশ Linuxes সঙ্গে অন্তর্ভুক্ত, তবে busybox এর psশো কি সৌন্দর্য উদাহরণস্বরূপ আমি প্রদত্ত অনুরূপ আউটপুট যাবে। আপনি বেশিরভাগ লিনাক্সে বুসিবক্স ইনস্টল করতে পারেন এবং এটির মতো চালাতে পারেন:

$ busybox ps
  852 root       0:00 /sbin/auditd -n
  855 root       0:01 /sbin/audispd
  857 root       0:00 /usr/sbin/sedispatch
  866 root       0:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
  867 root       0:00 /usr/libexec/bluetooth/bluetoothd
  869 root       0:01 {firewalld} /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
  871 root       0:32 /usr/libexec/accounts-daemon
  873 rtkit      0:05 /usr/libexec/rtkit-daemon
  875 root       0:00 /usr/sbin/ModemManager
  876 avahi      0:03 avahi-daemon: running [dufresne.local]
  878 root       0:54 /usr/sbin/irqbalance --foreground
  884 root       0:00 /usr/sbin/smartd -n -q never
  886 avahi      0:00 avahi-daemon: chroot helper
  891 chrony     0:01 /usr/sbin/chronyd
  892 root       0:01 /usr/lib/systemd/systemd-logind
  893 dbus       1:28 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

পদ্ধতি # 2 - ব্যবহার / প্রকল্প

cmdlineপ্রতিটি পিআইডি অন্তর্ভুক্ত থাকা ফাইলটিও দেখতে পারেন /proc/<pid>

$ cat /proc/28865/cmdline 
bash-csleep 10000; while [ 1 ];do echo hi;sleep 10;done

তবে লক্ষ্য করুন যে এটির ফাঁকা জায়গাটি অনুপস্থিত। এটি আপনার কমান্ড লাইন আর্গুমেন্টগুলি পৃথক করতে এই ফাইলটির মধ্যে কোনও NUL অক্ষর ব্যবহৃত হচ্ছে। যদিও চিন্তা করার দরকার নেই, এগুলি ছিটকে ফেলা যায়।

$ tr '\0' ' ' </proc/28865/cmdline
bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done

তথ্যসূত্র


2

পিআইডি জানা, শুধু এক্সিকিউট

বিড়াল / proc / পিড / সেমিডলাইন

উদাহরণস্বরূপ, পিআইডি = 127 এর জন্য

# cat /proc/127/cmdline ; echo ""
/usr/lib/jvm/jdk-8-oracle-x64//bin/java-Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager-Djava.library.path=/usr/lib/jni-javaagent:/jmxtrans-agent-1.2.2.jar=/opt/tomcat/conf/jmxtrans-agent.xml-Dcom.sun.management.jmxremote.port=5000-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-Djava.endorsed.dirs=/opt/tomcat/endorsed-classpath/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar-Dcatalina.base=/opt/tomcat-Dcatalina.home=/opt/tomcat-Djava.io.tmpdir=/opt/tomcat/temporg.apache.catalina.startup.Bootstrapstart
#
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.