프로세스에서 전체 명령 줄을 얻는 방법?


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또는 논쟁입니다. 프로세스 이름을 알고 인수를 원합니다. SliTaz에서 Busybox를 사용하고 있습니다.


출력을 처리하려고합니까 ps(권장하지 않음) ps출력을 줄 수있는 대체 명령을 찾고 있습니까? ps여러 줄의 출력을 줄 때 무엇을해야 합니까? 모두 / 처음 / 마지막으로 인쇄 하시겠습니까?
Anthon

1
어떤 운영 체제를 사용하십니까?
Cyrus

내 질문을 편집했습니다. 프로세스 이름을 알고 인수를 원합니다. Busybox와 함께 SliTaz (최소 Linux)를 사용하고 있습니다.
Michael

당신은 시도 해 봤나 @Michael arg처럼 command@ 존에 따라 대답은 ?
Pandya

예. 그러나 변수에 쓰는 방법은 무엇입니까? PID = pidof <process name>ps -o pid, args | grep $ PID | tr -s ""| cut -d ""-f 2 그러나 이렇게하면 하나의 변수에 인수를 얻지 못합니다
Michael

답변:


54

당신은 사용할 수 있습니다 -o귀하의 출력 형식을 지정하는 스위치를 :

$ ps -eo args

에서 맨 페이지 :

모든 인수를 문자열로 사용하여 명령합니다. 인수에 대한 수정 사항이 표시 될 수 있습니다. [...]

-p스위치를 사용하여 특정 PID를 선택할 수도 있습니다 .

$ ps -p [PID] -o args

pidof프로세스 이름에서 PID로 전환하는 데 사용될 수 있으므로 -p이름과 함께 사용할 수 있습니다 .

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

물론 grep이것을 사용할 수도 있습니다 (이 경우 -e스위치 를 추가해야합니다 ).

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

GNU ps를 사용하면 헤더를 제거 할 수도 있습니다 (물론이를 사용할 때는 필요하지 않습니다 grep).

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

다른 시스템에서는 AWK 또는 sed로 파이프 할 수 있습니다.

$ 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 argscommand(또는 cmd)로 바꿉니다 .
Pandya

@Pandya 둘 모두 cmdcommand대한 별칭 args이므로 불필요합니다.
John WH Smith

Busybox를 사용하는 -p 옵션이 없습니다. 사용법 : ps [-o COL1, COL2 = HEADER] [-T]
Michael

grep실제로 관심있는 라인을 잡는 데 사용할 수 있습니다 ps -eo args | grep dhcpcd | head -n -1. 내 답변을 편집했습니다.
John WH Smith

아, 이것 좋아 보인다 : ps -o args | grep <프로세스 이름> | head -n 1
Michael

12

다음과 같이 해보십시오 :

(내 라우터 중 하나에서 OpenWrt의 busybox의 출력 예)

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$PIDC-ish 문자열과 같은 프로세스 인수가 차례로 포함 됩니다. 각 문자열은 0으로 종료됩니다.

따옴표 arround 일부 인수 또는 옵션은 쉘 일입니다. 표시되는 행과 쉘에 특별한 의미를 가진 공백 또는 다른 문자가 사용되는 위치를 자세히 살펴 봐야합니다. 이러한 행을 다시 명령 행에 결합 할 때 해당 문자를 인용하거나 완전한 인수를 인용해야합니다.


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

@Cyrus : 그런 다음 공백이 포함 된 arg와 인접한 개별 arg를 구별 할 수 없습니다. 0 바이트를 공백으로 바꾸면 정보가 파괴됩니다.
yeti

1
나는 \0``를 나쁜 것으로 바꾸는 것에 동의 하지만, 나는 tr '\0' '\n' < /proc/$foo/cmdline조금 더 단순 하다고 생각 한다 xargs.
패트릭

printf출력에 따옴표를 쉽게 추가하고 줄 바꿈 대신 공백을 삽입하십시오. 더 많은 처리를 추가 할 생각이라면 그 printf시작은 좋은 시작입니다.
yeti

12

방법 # 1-ps 사용

사용할 수 있습니다 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에는 대부분의 Linux에 포함 된 -eaf전형적인 스위치 가 포함되어 있지 ps않지만 Busybox ps는 내가 제공 한 예제와 매우 유사한 출력을 보여줍니다. 대부분의 Linux에 Busybox를 설치하고 다음과 같이 실행할 수 있습니다.

$ 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-/ proc 사용

cmdline각 PID 에있는 파일을 볼 수도 있습니다 /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

PID를 알기 만하면 exec

고양이 / proc / pid / cmdline

예를 들어 PID = 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.