Jak uzyskać argumenty polecenia lub cały wiersz polecenia z uruchomionego procesu, używając jego nazwy?
Na przykład ten proces:
# ps
PID USER TIME COMMAND
1452 root 0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
I chcę /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
tylko argumentów. Znam nazwę procesu i chcę jego argumentów. Używam Busybox na SliTaz.
ps
(niezalecane), czy szukasz alternatywnego poleceniaps
, które da ci wynik? Co należy zrobić, gdyps
podaje się wiele wierszy wyników? wydrukować wszystko / pierwszy / ostatni?arg
jakcommand
na odpowiedź @John ?pidof <process name>
ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Ale w ten sposób nie otrzymuję argumentów w jednej zmiennejOdpowiedzi:
Możesz użyć
-o
przełącznika, aby określić format wyjściowy:Ze strony podręcznika :
Możesz także użyć
-p
przełącznika, aby wybrać określony PID:pidof
może również służyć do zmiany nazwy procesu na PID, co pozwala na użycie-p
z nazwą:Oczywiście możesz również użyć
grep
do tego (w takim przypadku musisz dodać-e
przełącznik):GNU ps pozwala również na usuwanie nagłówków (oczywiście nie jest to konieczne przy użyciu
grep
):W innych systemach możesz przesyłać do AWK lub sed:
Edycja: jeśli chcesz złapać tę linię do zmiennej, po prostu użyj
$(...)
jak zwykle:lub z
grep
:źródło
args
zcommand
(acmd
).cmd
icommand
są pseudonimamiargs
, prawdopodobnie nie jest to konieczne.grep
do połowu linię jesteś rzeczywiście zainteresowany:ps -eo args | grep dhcpcd | head -n -1
. Zredagowałem swoją odpowiedź.Wypróbuj coś takiego:
(przykładowe wyjście z busybox na OpenWrt na jednym z moich routerów)
/proc/$PID/cmdline
zawiera argumenty procesu,$PID
takie jak łańcuchy C po kolei. Każdy ciąg znaków kończy się na zero.Cytaty wokół niektórych argumentów lub opcji są materiałami powłoki. Musisz przyjrzeć się bliżej wyświetlanym wierszom i miejscu, w którym używane są spacje lub inne znaki o specjalnym znaczeniu dla powłoki. Będziesz musiał jakoś zacytować ten znak (znaki) lub pełny argument przy ponownym łączeniu tych linii z linią poleceń.
źródło
tr "\0" " " </proc/991/cmdline
\0
go słowem `` być zły, ale myślę, żetr '\0' '\n' < /proc/$foo/cmdline
jest nieco prostszy niżxargs
.printf
ułatwia dodawanie cudzysłowów do danych wyjściowych, wstawianie spacji zamiast nowej linii i tak dalej. Myślenie o dodaniu większej ilości przetwarzaniaprintf
jest dobrym początkiem.Metoda nr 1 - Korzystanie z ps
Możesz użyć
ps -eaf | grep 1234
.Przykład
UWAGA: Busybox
ps
nie zawiera-eaf
przełączników, jak pokazano powyżej, z typowego,ps
który jest zawarty w większości Linuksów, jednak Busyboxps
pokazuje, co wygląda bardzo podobnie do wyjścia podanego przeze mnie. Możesz zainstalować Busybox na większości Linuksów i uruchomić go w następujący sposób:Metoda nr 2 - Korzystanie z / proc
Możesz także spojrzeć na
cmdline
plik, pod którym znajduje się każdy PID/proc/<pid>
.Ale zauważ, że brakuje odstępów. Wynika to z użycia znaku NUL w tym pliku do oddzielenia argumentów wiersza poleceń. Nie martw się, można je rozebrać.
Bibliografia
źródło
Znając PID, po prostu exec
Na przykład dla PID = 127
źródło