음...
현재 하는 작업은 daemon의 실행 path를 등록한 후 그 넘들이 살아있나 죽어있나 혹은 memery size는 얼마인가 zombie가 되었나 안 되었나 cpu wait time은 얼마인가.. 등등의 정보를 가져온 후 적절한 조치를 취하는 모니터링 데몬을 만드는 중인데...
solaris에서 구현했을 때에는 /proc 아래에 보면 pid를 name으로 하여 생성되어 있는 directory에서 psinfo file을 뒤져보면 알 수 있었습니다.
근데 hp에서는 그런 것들을 어떤 방법으로 하여야만 할 수 있는지를 몰라서 질문을 드린거고요....
name으로 찾으면 당연히 1개 이상이 튀어나오겠죠... 그 모든 넘들을 제어하는 것이 지금 하고 있는 일의 목적입니다.
물론 감시대상이 되는 데몬들이 뜰때 pid를 특정 위치에 기록하게 함으로써.. 그 정보를 주워서 구현하는 방법도 있지만.... 몇 가지 이유로 다른 방법을 찾고 있네요....
이것은 각 벤더별로 제공되는 프로세스 테이블을 뒤지는 수밖에 없습니다.
예전에 솔라리스하고 AIX에서 이런 프로그램을 짰는데, ps 소스를 보면서 짰습니다. 짰다기 보다는 거의 거기 있는 라이브러리를 그냥 import해서 썼습니다.
그런데 그렇게 해서도 문제가 조금씩은 발생하더군요. 예를 들어 java 프로그램의 경우는 커맨드 라인이 거의 살인적으로 길고, argv[0]는 항상 같고 뒤에 오는 녀석들을 분석해서 tomcat인지 아니면 다른 프로그램인지 알아내야 되었는데 기본적으로 커맨드 라인이 80자던가? 그 정도만 기억되더군요. 그래서 확장하는 부분까지 찾아내서 프로그래밍하느라 고생했던 기억이 납니다. 하여간 벤더별로 다른 것들은 정말 힘듭니다... ^^*
PS) 그리고 SNMP(Simple Network Management Protocol)는 네트워크 관리하는 프로토콜 규약입니다. network healthy를 생각하여 망감시할 경우 사용하죠. 프로세스 테이블쪽과는 관련성이 없군요.
========================================
* The truth will set you free.
#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;
}
예를 들어 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.
pstat_getproc
man pstat_getproc ..
pstat_getproc
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);
음...현재 하는 작업은 daemon의 실행 path를 등록한 후 그
음...
현재 하는 작업은 daemon의 실행 path를 등록한 후 그 넘들이 살아있나 죽어있나 혹은 memery size는 얼마인가 zombie가 되었나 안 되었나 cpu wait time은 얼마인가.. 등등의 정보를 가져온 후 적절한 조치를 취하는 모니터링 데몬을 만드는 중인데...
solaris에서 구현했을 때에는 /proc 아래에 보면 pid를 name으로 하여 생성되어 있는 directory에서 psinfo file을 뒤져보면 알 수 있었습니다.
근데 hp에서는 그런 것들을 어떤 방법으로 하여야만 할 수 있는지를 몰라서 질문을 드린거고요....
name으로 찾으면 당연히 1개 이상이 튀어나오겠죠... 그 모든 넘들을 제어하는 것이 지금 하고 있는 일의 목적입니다.
물론 감시대상이 되는 데몬들이 뜰때 pid를 특정 위치에 기록하게 함으로써.. 그 정보를 주워서 구현하는 방법도 있지만.... 몇 가지 이유로 다른 방법을 찾고 있네요....
프로세스 이름만으로 pid를 얻는 그 날까지~~~~~ :D
Be Happy
프로그램 이름으로 pid를 찾는것은 좀 문제가 있을 같내요..프로
프로그램 이름으로 pid를 찾는것은 좀 문제가 있을 같내요..
프로그램이름이 같은데.. 디렉토리가 틀린곳에 실행되면 어떻게 하시겠어요?
lsof 소스를 참고 해 보세요. HP쪽은 잘 모르겠지만.. aix 쪽 작업할때는 참고 할만한 코드가 들어 있더군요..
대충.. 프로그램의 device와 inode값으로 pid를 찾는 루틴이었는데..
getproc() 로 프로세스의 커널주소를 얻은 다음 /dev/mem 읽어 프로세스의
device, inode값을 얻고 찾고자 하는 프로그램 것과 비교하는 방법으로 pid를 찾을 수 있을거 같내요.
그럼.. 성공하시길..
SNMP
그렇다면...
SNMP를 사용을 하시면은 님의 걱정은 한 방에 해결이 될 것 같네요.
근데... 이 SNMP 부분을 소스에 적용하는게 좀 분석하고 구현 하는데 시간이 걸리실것 같군요...
여하튼 SNMP를 이용해 보시길...
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
감사합니다.
lsof 소스쪽에 보니 모든 벤더에 대한 코드가 있더군요.. 당근 HP도....
결국은 심블 테이블을 뒤지는 우려했던 방향으로 나가는 군요..
작업 시간이 별로 남질 않아서 SNMP는 ㅎㅎㅎ(근데 SNMP가 뭔지 몰라서 그러는데 이런 종류의 작업과 어떤 상관이 있는지 알고 싶네요 :D )
보다 단순하고 직관적인 방법을 찾길 바랬는데...
답변을 주신 모든 분께 감사드립니다.
Be Happy
해봤던 사용자로서...
윗분이 이미 답을 찾으셨다니 다행이군요.
이것은 각 벤더별로 제공되는 프로세스 테이블을 뒤지는 수밖에 없습니다.
예전에 솔라리스하고 AIX에서 이런 프로그램을 짰는데, ps 소스를 보면서 짰습니다. 짰다기 보다는 거의 거기 있는 라이브러리를 그냥 import해서 썼습니다.
그런데 그렇게 해서도 문제가 조금씩은 발생하더군요. 예를 들어 java 프로그램의 경우는 커맨드 라인이 거의 살인적으로 길고, argv[0]는 항상 같고 뒤에 오는 녀석들을 분석해서 tomcat인지 아니면 다른 프로그램인지 알아내야 되었는데 기본적으로 커맨드 라인이 80자던가? 그 정도만 기억되더군요. 그래서 확장하는 부분까지 찾아내서 프로그래밍하느라 고생했던 기억이 납니다. 하여간 벤더별로 다른 것들은 정말 힘듭니다... ^^*
PS) 그리고 SNMP(Simple Network Management Protocol)는 네트워크 관리하는 프로토콜 규약입니다. network healthy를 생각하여 망감시할 경우 사용하죠. 프로세스 테이블쪽과는 관련성이 없군요.
========================================
* The truth will set you free.
답변..
프로세스 이름을 가지고 해당 프로세스의 정보를 찾는 것 또한 가능합니다.
간단한 예제 입니다.
위의 소스에서
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부터 갖가지 정보들이 들어갑니다...
감사해요.
찢어지는 입 어찌 해야 할 바를 모르겠군요.... :lol:
일을 빨리 시작하니 않은게 얼마나 다행인지....
moonzoo님 감사합니다.
Be Happy
음...벌써 해결책이 나왔군요...혹시 모르니..../us
음...벌써 해결책이 나왔군요...
혹시 모르니....
/usr/sbin/fuser 명령도 참조해 보시기 바랍니다.
fullpath 를 넘겨주면 이 파일이 사용되고 있는(실행되건 open 되건)
프로세스를 알려줍니다.
그럼...
from saibi
여담으로...
프로세스 테이블을 읽는 것은 SysV, AIX, 구형SunOS 가 서로 틀립니다.
이것에 대한 예제가 UNIX Programming FAQ 에 있으니 뉴스그룹에서 다운받아서 보시기 바랍니다. 아래는 SysV용 예제
========================================
* The truth will set you free.
Re: 해봤던 사용자로서...
결코 딴지가 아님을 미리 밝혀 둡니다. ^^
자바의 경우는 커맨드라인 바로 뒤에 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.
-D 하고 패키지 명은 상관이 없지 않나요?
흠... 제가 말을 잘못한거 같군요.
WAS같은 녀석은 풀패키지명이나 여러가지 옵션이 덕지덕지 붙어서 80자를 아무 가볍게 넘어줘서 찾기가 정말 힘들었었던 거였죠. ^^*
풀패키지명이나 혹은 옵션도 축약이 가능한가요? 그건 안될거 같은데... :shock:
========================================
* The truth will set you free.
댓글 달기