Linux: Jak wiedzieć, gdzie rozpoczął się proces i jak się zaczął?


33

Sprawdzałem okno Linuksa i znalazłem działający proces Perla, który miał duży udział w używaniu procesora. Z topem mogłem perl tylko w nazwie procesu.

Kiedy nacisnąłem c , aby wyświetlić wiersz poleceń, pokazał / var / spool / mail. Co nie ma sensu, ponieważ jest to katalog.

Moje pytania to:

1) Dlaczego tak się stało? Jak ten proces perla może maskować wiersz poleceń? 2) Jaki jest najbardziej niezawodny sposób ustalenia, gdzie i jak rozpoczął się proces?

Dzięki!

Odpowiedzi:


36

W większości przypadków wystarczy samo uruchomienie pswraz z ulubionymi flagami, aby umożliwić szerokie wyjście. Pochylam się ps -feww, ale inne sugestie tutaj zadziałają. Zauważ, że jeśli program został uruchomiony z czyjejś nazwy $PATH, zobaczysz tylko nazwę pliku wykonywalnego, a nie pełną ścieżkę. Na przykład spróbuj tego:

$ lftp &
$ ps -feww | grep ftp
lars      9600  9504  0 11:30 pts/10   00:00:00 lftp
lars      9620  9504  0 11:31 pts/10   00:00:00 grep ftp

Ważne jest, aby pamiętać, że widoczne informacje psmogą zostać całkowicie nadpisane przez uruchomiony program. Na przykład ten kod:

int main (int argc, char **argv) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Jeśli skompiluję to do pliku o nazwie „mójprogram” i uruchomię go:

$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201

A następnie uruchom ps, zobaczę inną nazwę procesu:

$ ps -f -p 10201
UID        PID  PPID  C STIME TTY          TIME CMD
lars     10201  9734  0 11:37 pts/10   00:00:00 foobar

Możesz także spojrzeć bezpośrednio na /proc/<pid>/exe, który może być dowiązaniem symbolicznym do odpowiedniego pliku wykonywalnego. W powyższym przykładzie daje to o wiele bardziej przydatne informacje niż ps:

$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp

1
wszystkie, w sumie, pliki /procdostarczą wszystkich informacji o programie, exebędą linkiem do pliku wykonywalnego, cwddo bieżącego katalogu roboczego, fdkatalog zawiera linki do otwartych plików (w tym standardowe wejście, wyjście i standardowy błąd)
Hubert Kario

57

Najbardziej niezawodnym sposobem jest przyjrzenie się /procreżimowi tego procesu. Każdy proces ma /proc/<pid>/katalog, w którym przechowuje takie informacje, jak:

  1. cwd link do bieżącego katalogu roboczego
  2. fd katalog z linkami do otwartych plików (deskryptorów plików)
  3. cmdline przeczytaj go, aby zobaczyć, jakiej linii poleceń użyto do uruchomienia procesu
  4. environ zmienne środowiskowe dla tego procesu
  5. root link do tego, co proces uważa za katalog główny (będzie / chyba że będzie chrootowany)

Jest więcej fajnych informacji o każdym procesie / proc, ale z tymi powyżej będziesz mógł dokładnie wiedzieć, co się dzieje.

Również użycie ps auxfpokaże ci, kto rozwidlił co, abyś mógł dowiedzieć się, kto dzwoni do twojego perla.


Zawsze używam Process Explorera w systemie Windows i zastanawiałem się, czy istnieje odpowiednik w systemie Linux. Ten przełącznik to wszystko! ps auxf ... fajnie!
Yanick Girouard

1
+1 dla parametru f dla ps, to zrobiło to dla mnie!
Lennart Rolland

2
+1 za nauczenie mnie czegoś, co wydaje się tak fundamentalną koncepcją ... /proczawiera informacje o procesie! kto wiedział?? wszystko, czego tam szukałem, to versioni tak cpuinfodalej ... a to rozwiązuje mój rzeczywisty problem, ponieważ wersja ps mojego routera ignoruje wszystkie parametry
Nacht - Przywróć Monikę

@coredump: a jeśli proces zadzwonił chroot()wcześniej, skąd mam wiedzieć, który katalog /proc/ᴘɪᴅ/cwdodpowiada?
user2284570

10

dla mnie, właśnie teraz, odkryłem, że pstreedawało to znacznie jaśniejsze wskazanie, jak rozpoczął się proces, niżps aux

To wygląda tak:

  ├─lightdm─┬─Xorg
  │         ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[{apache2}]]
  │         │         │      ├─at-spi-bus-laun─┬─dbus-daemon
  │         │         │      │                 └─3*[{at-spi-bus-laun}]
  │         │         │      ├─at-spi2-registr───{at-spi2-registr}
  │         │         │      ├─dbus-daemon
  │         │         │      ├─dropbox───29*[{dropbox} ]

2

Spróbuj ps axww | grep perluzyskać pełny wiersz poleceń swojego procesu. Wygląda jak topprzycięta długa linia.


2

Spróbuj użyć polecenia fuser -vu /var/spool/mail To polecenie wyświetla PID procesów korzystających z określonych plików lub systemów plików. W domyślnym trybie wyświetlania po każdej nazwie pliku występuje litera oznaczająca rodzaj dostępu:

c - bieżący katalog. e - uruchamiany plik wykonywalny. f - otwórz plik. f jest pomijane w domyślnym trybie wyświetlania. r - katalog główny. m - plik mmap lub biblioteka współdzielona.

Być może pomoże ci to w kontynuowaniu poszukiwań i odpowiedzi, której szukasz. Nie wiem, czy ci to pomaga, ale może znajdziesz przydatne informacje.


1

Bez sprawdzania dokładnych flag na stronie podręcznika, łatwy sposób na sfinansowanie linii poleceń i czasu rozpoczęcia, ps auxwww powinien działać. Możesz uczynić go bardziej eleganckim, jeśli chcesz, czytając stronę podręcznika.


1

Przychodzą mi na myśl dwa polecenia:

1) uzyskaj czas rozpoczęcia procesu z „ ps ”.

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) lastcomm , który teraz sprawdzam, nie mam zainstalowanego. W każdym razie opis strony podręcznika mówi:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Ale jak powiedziało kilka osób, „ls -al / proc /” powie ci wiele!


0

możesz użyć:

systemctl status <PID>

lub z nazwą procesu:

systemctl status $(pgrep perl)

Spowoduje to dostarczenie informacji o usługach systemowych, które rozpoczęły proces.

Znalazłem tę wskazówkę tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.