Jest więcej informacji na /proc/<pid>temat Linuksa, wystarczy spojrzeć.
Na innych Uniksach może być inaczej. psKomenda będzie działać wszędzie, /procrzeczy jest OS specyficzny. Na przykład w systemie AIX nie ma cmdlinew /proc.
w systemie Linux prawdopodobnie potrzebujesz -ww (tj. ps -ww -fp <pid>), aby określić szeroki wynik, ponieważ jeśli istnieje kilka poleceń, mogą zostać odcięte.
cat /proc/<pid>/cmdlinedziała również na Cygwin, gdzie argumenty linii cmd nie są wyświetlane w psżadnej opcji.
lechup
3
W Linuksie, jeśli potrzebujesz tylko args, polecenie to jest ps -o args -p <pid>i wypisze argslub użyje opcji -o, cmdjeśli tylko chcesz zobaczyć cmd. Próba czytania /proc/<pid>/cmdlinenie zawsze będzie działać dla nieuprzywilejowanych użytkowników. psNarzędzie będzie działać.
alvits
2
Wskazówka: długość /proc/<pid>/cmdlinejest ograniczona (zakodowana na stałe do wartości parametru jądra PAGE_SIZE), więc dłuższe linie poleceń są nadal pokazywane jako obcięte! Aby uzyskać więcej informacji, zobacz stackoverflow.com/questions/199130/ ... Możesz zapytać o ustawienia jądra getconf PAGE_SIZE, zwykle jest to 4096.
t0r0X
61
To załatwi sprawę:
xargs -0 < /proc/<pid>/cmdline
Bez xargs między argumentami nie będzie spacji, ponieważ zostały one przekonwertowane na wartości NUL.
Białe znaki nie są usuwane, są zastępowane wartościami NUL
bdonlan
@bdonlan Ah, nie sprawdziłem tego. Dobry chwyt!
lothar
4
xargs -0 echo </ proc / <pid> / cmdline. Możesz to również zrobić za pomocą / proc / <pid> / Environment, chociaż możesz chcieć dodać w tym celu opcję -n 1.
camh
W moim systemie nie ma systemu plików / proc :( jakieś inne rozwiązanie?
Hemant
Mój jest procesem Java z długimi, długimi, długimi parametrami. Nadal obciąża moje wyjście. Jakaś rada?
johnsam
14
Możesz używać pgrepz -f(pełnym wierszem poleceń) i -l(długim opisem):
pgrep -l -f PatternOfProcess
Ta metoda ma zasadniczą różnicę w stosunku do innych odpowiedzi: działa na CygWin , dzięki czemu można jej użyć do uzyskania pełnego wiersza polecenia dowolnego procesu działającego w systemie Windows (wykonaj jako podniesiony, jeśli chcesz danych o dowolnym podniesionym / administracyjnym procesie) . Każda inna metoda wykonywania tego w systemie Windows jest bardziej niewygodna ( na przykład ).
Ponadto: w moich testach sposób pgrep był jedynym systemem, który działał w celu uzyskania pełnej ścieżki dla skryptów działających w pythonie CygWin .
Do twojej wiadomości, możesz także użyć cat -v / proc / PID / cmdline | sed 's / \ ^ @ / \ n / g' . Spowoduje to zastąpienie znaku zerowego znakiem nowego wiersza. W ten sposób każdy argument zostanie wydrukowany w osobnej linii. W ten sposób łatwiej odróżnić jeden argument od drugiego.
Oprócz wszystkich powyższych sposobów konwersji tekstu, jeśli po prostu użyjesz „łańcuchów”, domyślnie utworzy on wyjście w osobnych wierszach. Z tą dodatkową zaletą, że może również zapobiegać pojawianiu się znaków, które mogą mieszać twój terminal.
Oba dane wyjściowe w jednym poleceniu:
strings / proc // cmdline / proc // environment
Prawdziwe pytanie brzmi ... czy istnieje sposób, aby zobaczyć prawdziwą linię komend procesu w Linuksie, która została zmieniona, tak aby cmdline zawierał zmieniony tekst zamiast faktycznie uruchomionej komendy.
Jeśli chcesz uzyskać jak najdłużej (nie jestem pewien, jakie są ograniczenia), podobnie jak w systemach Solaris , możesz użyć tego w systemach Linux i OSX:
tr \\0 ' ' < /proc/<pid>/cmdline
Odpowiedzi:
Istnieje kilka opcji:
Jest więcej informacji na
/proc/<pid>
temat Linuksa, wystarczy spojrzeć.Na innych Uniksach może być inaczej.
ps
Komenda będzie działać wszędzie,/proc
rzeczy jest OS specyficzny. Na przykład w systemie AIX nie macmdline
w/proc
.źródło
ps -ww -fp <pid>
), aby określić szeroki wynik, ponieważ jeśli istnieje kilka poleceń, mogą zostać odcięte.-ww
opcja umożliwia dostęp do pełnych argumentów wiersza polecenia (jak jest przechowywana przez jądro). Zobacz także: w jaki sposób solaris i bsd pobierają nieskalowane parametry wiersza polecenia dla procesu i opcji pscat /proc/<pid>/cmdline
działa również na Cygwin, gdzie argumenty linii cmd nie są wyświetlane wps
żadnej opcji.args
, polecenie to jestps -o args -p <pid>
i wypiszeargs
lub użyje opcji -o,cmd
jeśli tylko chcesz zobaczyćcmd
. Próba czytania/proc/<pid>/cmdline
nie zawsze będzie działać dla nieuprzywilejowanych użytkowników.ps
Narzędzie będzie działać./proc/<pid>/cmdline
jest ograniczona (zakodowana na stałe do wartości parametru jądra PAGE_SIZE), więc dłuższe linie poleceń są nadal pokazywane jako obcięte! Aby uzyskać więcej informacji, zobacz stackoverflow.com/questions/199130/ ... Możesz zapytać o ustawienia jądragetconf PAGE_SIZE
, zwykle jest to 4096.To załatwi sprawę:
Bez xargs między argumentami nie będzie spacji, ponieważ zostały one przekonwertowane na wartości NUL.
źródło
xargs -0 < /proc/<pid>/cmdline
.Pełna linia poleceń
W przypadku systemu Linux i Unix można użyć,
ps -ef | grep process_name
aby uzyskać pełny wiersz poleceń.W systemach SunOS, jeśli chcesz uzyskać pełny wiersz poleceń, możesz użyć
Aby uzyskać pełną linię poleceń, musisz zostać superużytkownikiem.
Lista argumentów
poda szczegółową listę argumentów przekazanych do procesu. Wyświetli tablicę argumentów w następujący sposób:
Nie znalazłem żadnego podobnego polecenia dla systemu Linux, ale użyłbym następującego polecenia, aby uzyskać podobne dane wyjściowe:
źródło
W systemie Linux
dostajesz komendę procesu (łącznie z argumentami), ale wszystkie białe znaki zostały zmienione na znaki NUL.
źródło
Możesz używać
pgrep
z-f
(pełnym wierszem poleceń) i-l
(długim opisem):Ta metoda ma zasadniczą różnicę w stosunku do innych odpowiedzi: działa na CygWin , dzięki czemu można jej użyć do uzyskania pełnego wiersza polecenia dowolnego procesu działającego w systemie Windows (wykonaj jako podniesiony, jeśli chcesz danych o dowolnym podniesionym / administracyjnym procesie) . Każda inna metoda wykonywania tego w systemie Windows jest bardziej niewygodna ( na przykład ).
Ponadto: w moich testach sposób pgrep był jedynym systemem, który działał w celu uzyskania pełnej ścieżki dla skryptów działających w pythonie CygWin .
źródło
$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
pgrep from procps-ng 3.3.15
i3.3.12
. Wystarczy wydrukować nazwę pid i prorgam bez argumentów.Innym wariantem drukowania
/proc/PID/cmdline
ze spacjami w systemie Linux jest:W ten sposób
cat
drukuje znaki NULL jako,^@
a następnie zamieniasz je spacją za pomocąsed
;echo
wypisuje nowy wiersz.źródło
Możesz po prostu użyć:
źródło
Zamiast używać wielu poleceń do edycji strumienia, po prostu użyj jednego - tr tłumaczy jeden znak na inny:
źródło
Oprócz wszystkich powyższych sposobów konwersji tekstu, jeśli po prostu użyjesz „łańcuchów”, domyślnie utworzy on wyjście w osobnych wierszach. Z tą dodatkową zaletą, że może również zapobiegać pojawianiu się znaków, które mogą mieszać twój terminal.
Oba dane wyjściowe w jednym poleceniu:
strings / proc // cmdline / proc // environment
Prawdziwe pytanie brzmi ... czy istnieje sposób, aby zobaczyć prawdziwą linię komend procesu w Linuksie, która została zmieniona, tak aby cmdline zawierał zmieniony tekst zamiast faktycznie uruchomionej komendy.
źródło
W systemie Solaris
podobne mogą być stosowane w systemach uniksopodobnych.
źródło
W Linuksie, z bash, wyprowadza jako cytowane argumenty, aby można było edytować polecenie i uruchomić je ponownie
W Solarisie, z bash (testowany z wydaniem 3.2.51 (1)) i bez przestrzeni użytkownika GNU:
Linux bash Przykład (wklej w terminalu):
Wynik:
Przykład Solaris Bash:
Wynik:
źródło
Jeśli chcesz uzyskać jak najdłużej (nie jestem pewien, jakie są ograniczenia), podobnie jak w systemach Solaris , możesz użyć tego w systemach Linux i OSX:
źródło
spróbuj
ps -n
w terminalu Linux. To pokaże:1. Wszystkie procesy RUNNING , ich linia poleceń i ich PID
Następnie dowiesz się, który proces zabić
źródło