HP에서의 PROCESS INFORMATION

twopairs의 이미지

작업중 막히는 부분이 있어서 여기에 들렀네요..

process의 이름만 가지고 pid를 비롯한 여러가지 정보를 얻으려고 하는데

HP에서는 한번도 해 보지 않았던 거네요. 이전에 solaris에서는 /proc/<pid>/psinfo file을 뒤져가면서 꾸역꾸역 했던 기억이 나는데....

HP는 답이 안 보이네요... /usr/include에도 단서를 못찾겠고....

HELP ME~~~ ㅎㅎㅎ

moonzoo의 이미지

man pstat_getproc ..

twopairs의 이미지

pstat_getproc를 봤는데 process의 정보를 보려면 pid를 인자로 입력해야 하더라구요.....

process의 name으로 process 정보를 알 수 있는 방법을 알고 싶습니다. ^^

Be Happy

서지훈의 이미지

그건 좀 문제가 있지 않을까 하는데요...
같은 이름의 프로세스가 몇 개인지도 모르고...
그러니 이건 list로 정보를 구현을 해야 하는 번거러움도 있고...-_-ㅋ
걍... unique한 pid가 좋은 argument가 아닌가 생각을...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

twopairs의 이미지

음...
현재 하는 작업은 daemon의 실행 path를 등록한 후 그 넘들이 살아있나 죽어있나 혹은 memery size는 얼마인가 zombie가 되었나 안 되었나 cpu wait time은 얼마인가.. 등등의 정보를 가져온 후 적절한 조치를 취하는 모니터링 데몬을 만드는 중인데...

solaris에서 구현했을 때에는 /proc 아래에 보면 pid를 name으로 하여 생성되어 있는 directory에서 psinfo file을 뒤져보면 알 수 있었습니다.

근데 hp에서는 그런 것들을 어떤 방법으로 하여야만 할 수 있는지를 몰라서 질문을 드린거고요....

name으로 찾으면 당연히 1개 이상이 튀어나오겠죠... 그 모든 넘들을 제어하는 것이 지금 하고 있는 일의 목적입니다.

물론 감시대상이 되는 데몬들이 뜰때 pid를 특정 위치에 기록하게 함으로써.. 그 정보를 주워서 구현하는 방법도 있지만.... 몇 가지 이유로 다른 방법을 찾고 있네요....

프로세스 이름만으로 pid를 얻는 그 날까지~~~~~ :D

Be Happy

faye의 이미지

프로그램 이름으로 pid를 찾는것은 좀 문제가 있을 같내요..

프로그램이름이 같은데.. 디렉토리가 틀린곳에 실행되면 어떻게 하시겠어요?

lsof 소스를 참고 해 보세요. HP쪽은 잘 모르겠지만.. aix 쪽 작업할때는 참고 할만한 코드가 들어 있더군요..

대충.. 프로그램의 device와 inode값으로 pid를 찾는 루틴이었는데..

getproc() 로 프로세스의 커널주소를 얻은 다음 /dev/mem 읽어 프로세스의
device, inode값을 얻고 찾고자 하는 프로그램 것과 비교하는 방법으로 pid를 찾을 수 있을거 같내요.

그럼.. 성공하시길..

서지훈의 이미지

그렇다면...
SNMP를 사용을 하시면은 님의 걱정은 한 방에 해결이 될 것 같네요.
근데... 이 SNMP 부분을 소스에 적용하는게 좀 분석하고 구현 하는데 시간이 걸리실것 같군요...
여하튼 SNMP를 이용해 보시길...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

twopairs의 이미지

lsof 소스쪽에 보니 모든 벤더에 대한 코드가 있더군요.. 당근 HP도....

결국은 심블 테이블을 뒤지는 우려했던 방향으로 나가는 군요..
작업 시간이 별로 남질 않아서 SNMP는 ㅎㅎㅎ(근데 SNMP가 뭔지 몰라서 그러는데 이런 종류의 작업과 어떤 상관이 있는지 알고 싶네요 :D )
보다 단순하고 직관적인 방법을 찾길 바랬는데...

답변을 주신 모든 분께 감사드립니다.

Be Happy

sunyzero의 이미지

윗분이 이미 답을 찾으셨다니 다행이군요.

이것은 각 벤더별로 제공되는 프로세스 테이블을 뒤지는 수밖에 없습니다.
예전에 솔라리스하고 AIX에서 이런 프로그램을 짰는데, ps 소스를 보면서 짰습니다. 짰다기 보다는 거의 거기 있는 라이브러리를 그냥 import해서 썼습니다.

그런데 그렇게 해서도 문제가 조금씩은 발생하더군요. 예를 들어 java 프로그램의 경우는 커맨드 라인이 거의 살인적으로 길고, argv[0]는 항상 같고 뒤에 오는 녀석들을 분석해서 tomcat인지 아니면 다른 프로그램인지 알아내야 되었는데 기본적으로 커맨드 라인이 80자던가? 그 정도만 기억되더군요. 그래서 확장하는 부분까지 찾아내서 프로그래밍하느라 고생했던 기억이 납니다. 하여간 벤더별로 다른 것들은 정말 힘듭니다... ^^*

PS) 그리고 SNMP(Simple Network Management Protocol)는 네트워크 관리하는 프로토콜 규약입니다. network healthy를 생각하여 망감시할 경우 사용하죠. 프로세스 테이블쪽과는 관련성이 없군요.

========================================
* The truth will set you free.

moonzoo의 이미지

프로세스 이름을 가지고 해당 프로세스의 정보를 찾는 것 또한 가능합니다.

간단한 예제 입니다.

#include <stdio.h>
#include <sys/pstat.h>
#define BURST ((size_t)10)

int Check_Exist_Proc();

void main()
{
    int     rt = 0;
    rt = Check_Exist_Proc();
    printf("\nTotal Process =%d\n",rt);


}

int Check_Exist_Proc()
{

    struct pst_status pst[BURST];
    int i, count;
    int idx = 0; /* index within the context */
    int exist_count = 0;


    while ((count=pstat_getproc(pst, sizeof(pst[0]),BURST,idx))>0) {

        for (i = 0; i < count; i++) {
            exist_count++;
            printf("\n[%d][%s]",exist_count,pst[i].pst_ucomm);
        }
        idx = pst[count-1].pst_idx + 1;
    }
    return exist_count;
}

위의 소스에서

printf("\n[%d][%s]",exist_count,pst[i].pst_ucomm);

pst[i].pst_ucomm이 프로세스 실행 name을 가리킵니다.

찾고자 하는 프로세스 네임과 이 이름을 비교한 후.

해당 i 번째 구조체에서 원하시는 정보를 가져오시면 될듯 합니다.

struct pst_status 의 정보는 /usr/include/sys/pstat.h 를 보시면

됩니다.. 프로세스 id부터 갖가지 정보들이 들어갑니다...

twopairs의 이미지

찢어지는 입 어찌 해야 할 바를 모르겠군요.... :lol:

일을 빨리 시작하니 않은게 얼마나 다행인지....

moonzoo님 감사합니다.

Be Happy

new5244의 이미지

음...벌써 해결책이 나왔군요...

혹시 모르니....

/usr/sbin/fuser 명령도 참조해 보시기 바랍니다.

fullpath 를 넘겨주면 이 파일이 사용되고 있는(실행되건 open 되건)
프로세스를 알려줍니다.

그럼...

from saibi

sunyzero의 이미지

프로세스 테이블을 읽는 것은 SysV, AIX, 구형SunOS 가 서로 틀립니다.

이것에 대한 예제가 UNIX Programming FAQ 에 있으니 뉴스그룹에서 다운받아서 보시기 바랍니다. 아래는 SysV용 예제

Reading the process table - SYSV version
========================================

     pid_t
     getpidbyname(char *name,pid_t skipit)
     {
         DIR  *dp;
         struct dirent *dirp;
         prpsinfo_t retval;
         int fd;
         pid_t ourretval=-1;
     
         if((dp=opendir("/proc"))==NULL){
             return -1;
         }
         chdir("/proc");
         while((dirp=readdir(dp))!=NULL){
             if(dirp->d_name[0]!='.'){
                 if((fd=open(dirp->d_name,O_RDONLY))!=-1){
                     if(ioctl(fd,PIOCPSINFO,&retval)!=-1){
                         if(!strcmp(retval.pr_fname,name)){
                             ourretval=(pid_t)atoi(dirp->d_name);
                             if(skipit!=-1 && ourretval==skipit){
                                 ourretval=-1;
                             }
                             else{
                                 close(fd);
                                 break;
                             }
                         }
                     }
                     close(fd);
                 }
             }
         }
         closedir(dp);
         return ourretval;
     }

========================================
* The truth will set you free.

kenji의 이미지

sunyzero wrote:
예를 들어 java 프로그램의 경우는 커맨드 라인이 거의 살인적으로 길고, argv[0]는 항상 같고 뒤에 오는 녀석들을 분석해서 tomcat인지 아니면 다른 프로그램인지 알아내야 되었는데 기본적으로 커맨드 라인이 80자던가? 그 정도만 기억되더군요. 그래서 확장하는 부분까지 찾아내서 프로그래밍하느라 고생했던 기억이 납니다. 하여간 벤더별로 다른 것들은 정말 힘듭니다... ^^*

결코 딴지가 아님을 미리 밝혀 둡니다. ^^
자바의 경우는 커맨드라인 바로 뒤에 define을 두어서 구별하면 쉽게 해결할 수 있습니다.
이를 테면

java -Dmyapp -cp .......

이렇게 하면 80자 제한도 피해갈 수 있습니다. :roll: (꽁수..)

---
What is real?
If you are talking about what you can see, what you can taste, what you can feel.
That is simply electric signals interpreted by your brain.

you're living in a dream world, Neo.

sunyzero의 이미지

흠... 제가 말을 잘못한거 같군요.

WAS같은 녀석은 풀패키지명이나 여러가지 옵션이 덕지덕지 붙어서 80자를 아무 가볍게 넘어줘서 찾기가 정말 힘들었었던 거였죠. ^^*

풀패키지명이나 혹은 옵션도 축약이 가능한가요? 그건 안될거 같은데... :shock:

========================================
* The truth will set you free.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.