프로세스 이름을 사용하여 실행 중인 프로세스에서 명령 인수 또는 전체 명령줄을 얻는 방법은 무엇입니까?
예를 들어 다음 프로세스는 다음과 같습니다.
# 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를 설치하고 다음과 같이 실행할 수 있습니다.ps
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 - /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
잘린