Bir işlemden tüm komut satırı nasıl alınır?


43

İşlem argümanlarını veya komut satırının tamamını işlem ismini kullanarak çalışan bir işlemden nasıl alabilirim?

Örneğin bu işlem:

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

Ve istediğim şey /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pidya da tartışmalar. İşlem adını biliyorum ve tartışmalarını istiyorum. SliTaz'da Busybox kullanıyorum.


Çıktısını işlemek istiyor musunuz ps(önerilmez) ya da size psçıktı verecek alternatif bir komut mu arıyorsunuz? psBirden fazla çıktı satırı verirken ne yapılması gerekiyor ? tümünü yazdır / ilk / son?
Anthon

1
Hangi işletim sistemini kullanıyorsunuz?
Cyrus

Sorumu değiştirdim. İşlem adını biliyorum ve tartışmalarını istiyorum. Busybox ile SliTaz (minimalist linux) kullanıyorum.
Michael

@Michael @John cevap başına arggibi denediniz mi? command
Pandya

Evet ama nasıl bir değişkene yazılır? İki komutu düşünüyorum: PID = pidof <process name>ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Ama bu şekilde argümanları bir değişkende göremiyorum
Michael

Yanıtlar:


54

-oÇıkış biçiminizi belirtmek için anahtarı kullanabilirsiniz :

$ ps -eo args

Gönderen adam sayfası :

Tüm argümanlarına bir dize olarak komut verin. Argümanlar üzerinde yapılan değişiklikler gösterilebilir. [...]

-pBelirli bir PID seçmek için anahtarı da kullanabilirsiniz :

$ ps -p [PID] -o args

pidofişlem adından PID'ye geçmek için de kullanılabilir, bu nedenle -pbir adla kullanımına izin verir :

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

Elbette, bunun için de kullanabilirsiniz grep(bu durumda, -eanahtarı eklemelisiniz ):

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

GNU ps ayrıca başlıkları kaldırmanıza da izin verir (elbette, kullanırken bu gereksizdir grep):

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

Diğer sistemlerde AWK veya sed'e yönlendirebilirsiniz:

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

Düzenleme: Bu satırı bir değişkende yakalamak istiyorsanız, $(...)her zamanki gibi kullanın :

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

veya grep:

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

@Michael (veya ) argsile değiştirin . commandcmd
Pandya

@Pandya Her ikisi de cmdve commandtakma adları args, bu muhtemelen gereksizdir.
John WH Smith

Busybox kullanarak bir -p seçeneğim yok: Kullanım: ps [-o COL1, COL2 = HEADER] [-T]
Michael

Sen kullanabilir grepaslında ilgilendiğiniz çizgisini yakalamak için: ps -eo args | grep dhcpcd | head -n -1. Cevabımı düzenledim.
John WH Smith

Oh, bu iyi görünüyor: ps -o args | grep <işlem adı> | kafa 1
Michael

12

Böyle bir şey dene:

(yönlendiricilerimden birinin üzerinde OpenWrt üzerindeki busybox'tan örnek çıktı)

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$PIDbirbirinin ardına C-ish dizeleri gibi işlem argümanlarını içerir . Her dize sıfır sonlandırılır.

Bazı argümanların veya seçeneklerin etrafındaki alıntılar kabuk parçalarıdır. Gösterilen satırlara ve kabuk için özel anlamı olan boşlukların veya diğer karakterlerin kullanıldığı yere daha yakından bakmak zorundasınız. Bu karakterleri bir şekilde ya da tam bir argümanı bu satırları bir komut satırına tekrar eklerken vermeniz gerekir.


1
tr "\0" " " </proc/991/cmdline
Cyrus

@Cyrus: O zaman boşlukları içeren boşlukları bitişik ayrı boşluklardan ayırt edemezsiniz. Sıfır baytı bir boşlukla değiştirerek bilgiyi yok edersiniz.
yeti

1
\0“Kötü olmak” ile değiştirmeyi kabul ediyorum , ancak benden tr '\0' '\n' < /proc/$foo/cmdlinebiraz daha basit olduğunu düşünüyorum xargs.
Patrick

printfçıktıya tırnak eklemeyi, yeni satır yerine boşluk bırakmayı vb. kolaylaştırır. Daha fazla işlem eklemeyi düşünürseniz, yol printfiyi bir başlangıçtır.
yeti

12

Yöntem # 1 - ps kullanma

Kullanabilirsiniz ps -eaf | grep 1234.

Örnek

$ 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

NOT: Busybox en psiçermez -eaftipik gelen yukarıda gösterildiği gibi anahtarları psancak, çoğu Linux dağıtımları ile busybox en eklenmiş durumda olduğunu psgörünüyor verdiğim örneğe çok benzer çıktı olmanın ne gösterir. Busybox'ı çoğu Linux'a yükleyebilir ve çalıştırabilirsiniz:

$ 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

Yöntem # 2 - / proc kullanma

cmdlineHer bir PID'nin bulunduğu dosyaya da bakabilirsiniz /proc/<pid>.

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

Fakat boşluğun eksik olduğuna dikkat edin. Bu komut satırı argümanlarınızı ayırmak için bu dosyada kullanılan bir NUL karakterinden kaynaklanmaktadır. Endişelenmeyin, bunlar çıkarılabilir.

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

Referanslar


2

PID'yi bilmek, sadece çalıştır

kedi / proc / pid / cmdline

Örneğin, PID = 127 için

# 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
#
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.