Como obter toda a linha de comando de um processo?

26

Como posso obter os argumentos de comando ou toda a linha de comando de um processo em execução usando o nome do processo?

Por exemplo, este processo:

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

E o que eu quero é /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid ou os argumentos. Eu sei o nome do processo e quero seus argumentos. Estou usando o Busybox no SliTaz.

    
por Michael 20.10.2014 / 14:36

4 respostas

35

Você pode usar a opção -o para especificar seu formato de saída:

$ ps -eo args

De a página do manual :

Command with all its arguments as a string. Modifications to the arguments may be shown. [...]

Você também pode usar a opção -p para selecionar um PID específico:

$ ps -p [PID] -o args

pidof também pode ser usado para alternar do nome do processo para o PID, permitindo assim o uso de -p com um nome:

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

Claro, você também pode usar grep para isso (nesse caso, você deve adicionar a opção -e ):

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

O GNU ps também permitirá que você remova os cabeçalhos (é claro que isso é desnecessário ao usar grep ):

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

Em outros sistemas, você pode canalizar para o AWK ou sed:

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

Editar: se você quiser pegar essa linha em uma variável, use $(...) como de costume:

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

ou, com grep :

$ CMDLINE=$(ps -eo args | grep dhcpcd | head -n -1)
    
por 20.10.2014 / 14:47
10

Tente algo assim:

(exemplo de saída do busybox no OpenWrt em um dos meus roteadores)

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 contém os argumentos do processo $PID , como sequências C-ish, uma após a outra. Cada string é terminada em zero.

Citações em alguns argumentos ou opções são coisas de shell. Você tem que olhar mais de perto as linhas que estão sendo mostradas e onde espaços ou outros caracteres com significado especial para o shell são usados. Você precisará citar esse (s) caractere (s) de alguma forma ou o argumento completo ao unir essas linhas a uma linha de comando novamente.

    
por 20.10.2014 / 15:01
7

Método 1 - Usando ps

Você pode usar ps -eaf | grep 1234 .

Exemplo

$ 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

OBSERVAÇÃO: O ps do Busybox não inclui as opções -eaf , como mostrado acima, de um típico ps incluído na maioria dos Linuxes, mas ps do Busybox mostra o que parece ser saída muito semelhante ao exemplo que eu forneci. Você pode instalar o Busybox na maioria dos Linuxes e executá-lo da seguinte forma:

$ 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

Método 2 - Usando o / proc

Você também pode ver o arquivo cmdline que cada PID tem sob /proc/<pid> .

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

Mas observe que está faltando o espaçamento. Isso ocorre porque um caractere NUL está sendo usado nesse arquivo para separar seus argumentos de linha de comando. Não se preocupe, eles podem ser removidos.

$ tr '
$ 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
' ' ' </proc/28865/cmdline bash -c sleep 10000; while [ 1 ];do echo hi;sleep 10;done

Referências

por 20.10.2014 / 15:00
1

Conhecendo o PID, apenas exec

cat /proc/pid/cmdline

Por exemplo, para 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
#
    
por 09.10.2017 / 09:13