프로세스에서 전체 명령줄을 가져오는 방법은 무엇입니까?

프로세스에서 전체 명령줄을 가져오는 방법은 무엇입니까?

프로세스 이름을 사용하여 실행 중인 프로세스에서 명령 인수 또는 전체 명령줄을 얻는 방법은 무엇입니까?

예를 들어 다음 프로세스는 다음과 같습니다.

# 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를 사용합니다.

답변1

-o스위치를 사용하여 출력 형식을 지정할 수 있습니다.

$ ps -eo args

~에서매뉴얼 페이지:

명령과 해당 매개변수는 모두 문자열입니다. 매개변수에 대한 수정사항이 표시될 수 있습니다. [...]

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

$ ps -p [PID] -o args

pidof-p프로세스 이름에서 PID로 전환하는 데에도 사용할 수 있으므로 이름이 허용됩니다 .

$ 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)

답변2

방법 #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(위 참조)가 포함되어 있지 않지만 Busybox에 표시되는 출력은 제가 제공한 예와 매우 유사합니다. 대부분의 Linux에 Busybox를 설치하고 다음과 같이 실행할 수 있습니다.psps

$ 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

인용하다

답변3

다음과 같이 시도해 보세요.

(내 라우터 중 하나에 있는 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$PID하나의 C 문자열처럼 프로세스의 매개변수를 포함합니다 . 모든 문자열은 0으로 종료됩니다.

일부 매개변수나 옵션에 대한 따옴표는 쉘적인 것입니다. 표시되는 줄과 쉘에 특별한 의미가 있는 공백이나 기타 문자를 사용하는 위치를 주의 깊게 살펴봐야 합니다. 이 줄을 명령줄에 다시 연결할 때 해당 문자나 전체 인수를 어떻게든 인용해야 합니다.

답변4

짧은 명령을 좋아하고 pgrep을 사용할 수 있다면 pgrep -fl <process_name>.

ps -o args잘린

관련 정보