Linux : 프로세스가 시작된 위치와 시작 방법을 확인하는 방법 이름 만

Linux 상자를 확인하고 perl 프로세스가 실행 중이며 CPU 사용량이 많이 있음을 발견했습니다. top을 사용하면 프로세스 이름 만 펄을 사용할 수 있습니다.

c를 누르면 명령 줄을 보려면 / var / spool / mail이 표시되었습니다. 이것은 디렉토리이기 때문에 의미가 없습니다.

내 질문은 :

1) 왜 이런 일이 일어 났습니까? 이 펄 프로세스가 어떻게 명령 행을 가리겠습니까? 2) 프로세스가 어디서 어떻게 시작되었는지 알아내는 가장 신뢰할 수있는 방법은 무엇입니까?

감사!



답변

대부분의 경우 ps, 넓은 출력을 가능하게하기 위해 선호하는 플래그와 함께 실행 만으로 충분합니다. 나는쪽으로 기댈 수 ps -feww있지만 다른 제안은 효과가 있습니다. 프로그램이 다른 사람에서 시작된 $PATH경우 전체 경로가 아니라 실행 파일 이름 만 표시됩니다. 예를 들어 다음을 시도하십시오.

$ 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

ps실행중인 프로그램이 표시되는 정보를 완전히 덮어 쓸 수 있다는 점에 유의해야합니다 . 예를 들어이 코드는 다음과 같습니다.

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

이것을 “myprogram”이라는 파일로 컴파일하고 실행하면 :

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

그런 다음을 실행 ps하면 다른 프로세스 이름이 표시됩니다.

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

/proc/<pid>/exe적절한 실행 파일에 대한 심볼릭 링크 일 수있는을 직접 확인할 수도 있습니다. 위의 예에서 이것은 다음보다 훨씬 유용한 정보를 제공합니다 ps.

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


답변

가장 신뢰할 수있는 방법은 /proc프로세스 의 디렉토리를 보는 것입니다. 각 프로세스에는 다음 /proc/<pid>/과 같은 정보를 유지 하는 디렉토리가 있습니다.

  1. cwd 현재 작업 디렉토리에 연결
  2. fd 열린 파일 (파일 설명자)에 대한 링크가있는 디렉토리
  3. cmdline 프로세스를 시작하는 데 사용 된 명령 행을 보려면 읽으십시오
  4. environ 해당 프로세스의 환경 변수
  5. root 프로세스가 루트 디렉토리로 간주하는 것에 대한 링크

각 프로세스 / proc에 대한 더 멋진 정보가 있지만 위의 프로세스를 사용하면 진행 상황을 정확하게 알 수 있습니다.

ps auxf또한를 사용 하면 누가 포크를했는지 보여 주므로 누가 펄을 부르는지 더 잘 알 수 있습니다.


답변

나에게 지금 막 나는 pstree프로세스가 어떻게 시작되었는지에 대한 훨씬 더 명확한 표시를 발견했다.ps aux

다음과 같이 보입니다 :

  ├─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} ]


답변

시도 ps axww | grep perl프로세스의 전체 명령 줄을 얻을. top긴 줄이 잘린 것 같습니다 .


답변

try use 명령
fuser -vu /var/spool/mail
이 명령은 지정된 파일 또는 파일 시스템을 사용하는 프로세스의 PID를 표시합니다. 기본 표시 모드에서 각 파일 이름 뒤에는 액세스 유형을 나타내는 문자가옵니다.

c-현재 디렉토리 e-실행 파일이 실행 중입니다. f-파일을 엽니 다. 기본 표시 모드에서는 f가 생략됩니다. r-루트 디렉토리 m-mmap’ed 파일 또는 공유 라이브러리.

찾고있는 답변을 찾기 위해 검색을 진행하는 데 도움이 될 수 있습니다. 그것이 도움이되는지 모르겠지만 유용한 정보를 찾을 수 있습니다.


답변

정확한 플래그에 대한 매뉴얼 페이지를 참조하여 명령 행과 시작 시간을 쉽게 알 수있는 방법 인 ps auxwww가 작동해야합니다. 원하는 경우 맨 페이지를 읽고 더 우아하게 만들 수 있습니다.


답변

두 가지 명령이 떠 오릅니다.

1) ‘ 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 , 지금 확인 했지만 설치하지 않았습니다. 어쨌든 매뉴얼 페이지 설명은 다음과 같습니다.

   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).

그러나 소수의 사람들이 말했듯이 “ls -al / proc /”는 많은 것을 말해 줄 것입니다!