2017-11-24 17 views
0

우분투에서/proc/'pid'/ exe를 읽으면 실행중인 프로세스의 전체 경로를 추출 할 수 있습니다.솔라리스에서 실행중인 프로세스의 실행 파일의 전체 경로를 프로그래밍 방식으로 얻는 방법은 무엇입니까?

solaris에는/proc/'pid'에 'exe'파일이 없습니다. 나는 psinfo를 읽었다. 그러나 그것은 단지 프로세스와 논증의 이름을 제공합니다. exe의 전체 경로가 없습니다. 솔라리스에서 어떻게 할 수 있습니까? 솔라리스 버전은 11.3입니다. 명령을 통해

+0

Solaris 11.3 SRU 5.6 이상 있습니까? –

+1

[psinfo \ _t solaris의 가능한 복제본은 해당 필드에 전체 프로세스 이름을 포함하지 않습니다] (https://stackoverflow.com/questions/35888100/psinfo-t-solaris-does-not-contain-full-process-name- in-its-field) –

답변

3

, 당신은 다음과 같이 실행 EXE 파일의 전체 경로를 얻을 수 있습니다 : 예를 들어

# ls -l /proc/<pid>/path/a.out 

# ls -l /proc/$$/path/a.out 
lrwxrwxrwx 1 root  root   0 Nov 24 17:19 /proc/14921/path/a.out -> /usr/bin/bash 

이렇게하면 실행 파일 경로를 얻을 수 있습니다. 예컨대 :

# readlink -f /proc/$$/path/a.out 
/usr/bin/bash 

를 들어

# readlink -f /proc/<pid>/path/a.out 

그리고 프로그래밍이처럼 작업을 수행 할 수 있습니다 :

더 convinient 방법입니다

# ./a.out <pid> 
:

#include <stdio.h> 
#include <unistd.h> 

#define BUF_SIZE 1024 

int main(int argc, char *argv[]) { 
    char outbuf[BUF_SIZE] = {'\0'}; 
    char inbuf[BUF_SIZE] = {'\0'}; 
    ssize_t len; 

    if (argc != 2) { 
      printf ("Invalid argument\n"); 
      return -1; 
    } 

    snprintf (inbuf, BUF_SIZE, "/proc/%s/path/a.out", argv[1]); 

    if ((len = readlink(inbuf, outbuf, BUF_SIZE-1)) != -1) { 
      outbuf[len] = '\0'; 
    } else { 
      perror ("readlink failed: "); 
      return -1; 
    } 

    printf ("%s\n", outbuf); 
    return 0; 
} 

그것은 사용의

+0

다시'readlink'. 이것은 기본적으로 모든 Solaris 11 호스트에 설치됩니다. GNU Coreutils * 패키지의 일부입니다. 전역 영역에 항상 존재하지만, 기본적으로 로컬 영역을 만들지 않습니다. 그 이유는 해당 패키지가 'solaris-small-server'IPS 그룹 (기본적으로 로컬 영역이되는 영역)의 일부가 아니기 때문입니다. 다른 말로하면 : 로컬 영역에서'pkg install gnu-coreutils'를 명시 적으로 설치해야합니다. 그러나 어쨌든 [모범 사례] (https://unix.stackexchange.com/questions/66415/solaris-default-install-user-tools)를 고려해야합니다. – peterh

0

솔라리스에서는 확실하지 않지만 일부 오래된 유닉스에서는 명령 이름이 argv[0] 인 경우에만 검색 할 수있었습니다. 그런 다음 PATH 환경 변수 에서 해당 명령을 올바른 순서 인으로 검색하여 명령의 전체 경로를 찾아야했습니다.

비트 수동이지만 방탄 형입니다.