LINUX.ORG.RU

Господа, снова - вкратце и по существу, ибо предыдущие мои излияния удалили. Главное, что мне не нравится в gkrellm, - это нагрузка на процессор. Она вроде как и небольшая, но gkrellm - софт, работающий постоянно, а значит - процессорное время накапливается. Я только что сделал замер: у меня за 10 минут работы gkrellm'а в столбце TIME+ top'а напротив него уже стоит 0:01. И он по этому параметру - второй вслед за иксами, более чем в два раза опережая kacpid (тоже прожорливое существо). Это не страшно для десктопа, но на ноутбуке, работающем от батарей, это проблема: индикатор, призванный показывать состояние батареи и другие параметры, сам жрёт этих батарей чуть ли не больше всех. Потому мне пришлось сварганить собственный индикатор заряда батареи, тактовой частоты (я юзаю speedstep и cpufreqd) и температуры процессора по принципу минимализма - без иксов и прочкй фигни. Некоторые здесь утверждают, что у них за более чем 7 часов работы машины top для gkrellm показывает TIME+ = 0:00, до этого заявив, что %CPU у него = 0,3 для того же gkrellm'а. Правдоподобность этого бреда оценивайте сами :)

anonymous
()
Ответ на: комментарий от anonymous

> без иксов и прочкй фигни

Аж самому смешно стало :) Я имел в виду - без gtk

anonymous
()
Ответ на: комментарий от anonymous

Вот текст моего чуда. Любые советы приветствуются, т.к. в
программировании я чайник, по работе занимаюсь иными вещами.

#include<X11/Xlib.h>
#include<X11/Xutil.h>
#include <X11/keysym.h>
#include<stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <string.h>

#define WIDTH 43
#define HEIGHT 34
#define CLOSEBTNSZ 10

/* ACPI files: */
char remfile[]="/proc/acpi/battery/BAT1/state";
char remparm[]="remaining capacity:";
char fullfile[]="/proc/acpi/battery/BAT1/info";
char fullparm[]="last full capacity:";
char acfile[]="/proc/acpi/ac_adapter/ACAD/state";
char acparm[]="state:";
char tempfile[]="/proc/acpi/thermal_zone/THRM/temperature";
char tempparm[]="temperature:";
char freqfile[]="/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq";

Display *display;
int screen;
Window mainwin,rootwin;
Atom del_atom;
double remcap,fullcap,cputemp,cpufreq;
int remain,acstate;
int needrefresh;

static void read_acpi(int signo)
{
	FILE *fp=NULL;
	struct stat statbuf;
	char *pos;
	int errcode,bufSize,readLen,i,j;
	double dtmp;
  XEvent ev;
	char numstr[8];
	char fileString[1025];

/* Reading the file remfile */
	errcode=1; fp=fopen(remfile,"r");
	if (fp!=NULL) {
	  readLen=fread(fileString,sizeof(char),1024,fp);
    if (ferror(fp)) fclose(fp); else {
  		fileString[readLen]=0; fclose(fp);
			pos=strstr(fileString,remparm)+strlen(remparm);
			i=0; while (pos[i]<'0') i++;
			j=i; while ((pos[j]>='0')&&(pos[j]<='9')) {numstr[j-i]=pos[j]; j++;}
    	numstr[j-i]=0;
    	remcap=atof(numstr);
			if (remcap!=0) errcode=0;
		}
	}

/* Reading the file fullfile */
	if (errcode==0) {
		errcode=1; fp=fopen(fullfile,"r");
	  if (fp!=NULL) {
		  readLen=fread(fileString,sizeof(char),1024,fp);
      if (ferror(fp)) fclose(fp); else {
    		fileString[readLen]=0; fclose(fp);
		  	pos=strstr(fileString,fullparm)+strlen(fullparm);
			  i=0; while (pos[i]<'0') i++;
  			j=i; while ((pos[j]>='0')&&(pos[j]<='9')) {numstr[j-i]=pos[j]; j++;}
      	numstr[j-i]=0;
      	fullcap=atof(numstr);
			  if (fullcap!=0) errcode=0;
      }
		}
	}

/* Calculating the remaining capacity in % */
  if (errcode==0) i=(int)(100*remcap/fullcap); else i=0;
	if (i!=remain) {needrefresh=1; remain=i;}

/* Reading the file acfile */
	errcode=1; fp=fopen(acfile,"r");
	if (fp!=NULL) {
	  readLen=fread(fileString,sizeof(char),1024,fp);
    if (ferror(fp)) fclose(fp); else {
  		fileString[readLen]=0; fclose(fp);
			pos=strstr(fileString,acparm)+strlen(acparm);
			i=0; while (pos[i]<=' ') i++;
			j=i; while (pos[j]>' ') {numstr[j-i]=pos[j]; j++;}
    	numstr[j-i]=0;
			if (strcmp(numstr,"on-line")==0) i=0; else i=-1;
    	if (i!=acstate) {needrefresh=1; acstate=i;}
		}
	}

/* Reading the file tempfile */
	errcode=1; fp=fopen(tempfile,"r");
	if (fp!=NULL) {
	  readLen=fread(fileString,sizeof(char),1024,fp);
    if (ferror(fp)) fclose(fp); else {
  		fileString[readLen]=0; fclose(fp);
			pos=strstr(fileString,tempparm)+strlen(tempparm);
			i=0; while (pos[i]<'0') i++;
			j=i; while ((pos[j]>='0')&&(pos[j]<='9')) {numstr[j-i]=pos[j]; j++;}
    	numstr[j-i]=0;
    	dtmp=atof(numstr);
			if (cputemp!=dtmp) {needrefresh=1; cputemp=dtmp;}
		}
	}

/* Reading the file freqfile */
	errcode=1; fp=fopen(freqfile,"r");
	if (fp!=NULL) {
	  readLen=fread(fileString,sizeof(char),32,fp);
    if (ferror(fp)) fclose(fp); else {
  		fileString[readLen]=0; fclose(fp);
			i=0; while ((fileString[i]>='0')&&(fileString[i]<='9')) i++;
    	fileString[i]=0;
    	dtmp=atof(fileString);
			if (cpufreq!=dtmp) {needrefresh=1; cpufreq=dtmp;}
		}
	}

	ev.type=Expose;
	XSendEvent(display,mainwin,False,StructureNotifyMask,&ev); XFlush(display);
	alarm(10);
}

anonymous
()
Ответ на: комментарий от anonymous

В одно сообщение не влезло, вот продолжение:

Window NewWindow(Window parentwin, unsigned int nw_posx,unsigned int nw_posy,
                 int nw_width,int nw_height,XColor back_color,int resizeable,
                 char *nw_name,char *nw_iconname,char *nw_class,char *nw_res,
                 int icon_width,int icon_height,char *icon_bits)
{
  Window nwin;
  unsigned long nw_winmask=CWBackPixel;
  XSetWindowAttributes nw_attr;
  XSizeHints nw_sizehints;
  Pixmap icon_pixmap;
  XTextProperty windowName,iconName;
  XWMHints wm_hints;
  XClassHint class_hints;

  XAllocColor(display,DefaultColormap(display,DefaultScreen(display)),
	            &back_color);
  nw_attr.background_pixel=back_color.pixel;
  nwin=XCreateWindow(display,parentwin,nw_posx,nw_posy,nw_width,
                     nw_height,0,CopyFromParent,InputOutput,
                     CopyFromParent,nw_winmask,&nw_attr);

  nw_sizehints.flags=PPosition|PSize|PMinSize|PMaxSize;
  if ((nw_posx==-1)|(nw_posy==-1))
	  nw_sizehints.flags=nw_sizehints.flags&(~PPosition);
	if (resizeable)
	  nw_sizehints.flags=nw_sizehints.flags&(~PMinSize)&(~PMaxSize);
  nw_sizehints.x=nw_posx;
  nw_sizehints.y=nw_posy;
  nw_sizehints.width=nw_width;
  nw_sizehints.height=nw_height;
  nw_sizehints.min_width=nw_width;
  nw_sizehints.min_height=nw_height;
  nw_sizehints.max_width=nw_width;
  nw_sizehints.max_height=nw_height;
  XSetNormalHints(display,nwin,&nw_sizehints);

  if (nw_name!=0)
  {
  XStringListToTextProperty(&nw_name,1,&windowName);
  XStringListToTextProperty(&nw_iconname,1,&iconName);
  wm_hints.initial_state=NormalState;
  wm_hints.input=True;
  icon_pixmap=0;
  wm_hints.flags=StateHint|InputHint;
  if ((icon_width!=0)&(icon_height!=0))
  {
    icon_pixmap=XCreateBitmapFromData(display,nwin,icon_bits,
                                      icon_width,icon_height);
    wm_hints.icon_pixmap=icon_pixmap;
    wm_hints.flags=wm_hints.flags|IconPixmapHint;
  }
  class_hints.res_name=nw_res;
  class_hints.res_class=nw_class;

  XSetWMProperties(display,nwin,&windowName,&iconName,0,0,
                   &nw_sizehints,&wm_hints,&class_hints);
  }
  return nwin;
}

int main(int argc,char **argv)
{
  XColor back_color;
	Window r;
	int itmp,w,h;
  XEvent ev;
  GC mw_GC;
  XFontStruct *mw_font;
  XFontStruct *rem_font;

  display=XOpenDisplay(0);
  if (!display){
    fprintf(stderr,"acpiinfo: Cannot open display, exiting\n");
    return;
  }
  screen=DefaultScreen(display);
  rootwin=RootWindow(display,screen);
  back_color.red=0xDfff; back_color.green=0xDfff; back_color.blue=0xEfff;
  XGetGeometry(display,rootwin,&rootwin,&itmp,&itmp,&w,&h,&
;itmp,&itmp);
  mainwin=NewWindow(rootwin,w-WIDTH-3,64,WIDTH,HEIGHT,back_color,0,"acpiinfo&
quot;,
                    "acpiinfo","acpiinfo_class",NULL,0,0,NULL);
  XSelectInput(display,mainwin,ButtonPressMask|VisibilityChangeMask|
               StructureNotifyMask|ExposureMask|ButtonReleaseMask|
               KeyPressMask);
  if ((del_atom=XInternAtom(display,"WM_DELETE_WINDOW", True))!=None)
    XSetWMProtocols(display,mainwin,&del_atom,1);
  XMapWindow(display,mainwin);
  XFlush(display);

  mw_font=XLoadQueryFont(display,"-*-helvetica-medium-r-*-*-*-100-*-*-*-*-*-*
");
  if (mw_font==0) mw_font=XLoadQueryFont(display,"variable");

  rem_font=XLoadQueryFont(display,"-*-helvetica-bold-r-*-*-*-100-*-*-*-*-*-*&
quot;);
  if (mw_font==0) mw_font=XLoadQueryFont(display,"variable");

  signal(SIGALRM,read_acpi); needrefresh=0; alarm(1);

anonymous
()
Ответ на: комментарий от anonymous

И окончание:

  while (1)
  {
	  long key;
		char strbuf[16];
    XColor fore_color;
		int i;

    XNextEvent(display,&ev);
    switch (ev.type) {
      case Expose:
        if ((ev.xexpose.count!=0)&&(needrefresh==0)) break;
        mw_GC=XCreateGC(display,mainwin,0,0);
        XSetForeground(display,mw_GC,XBlackPixel(display,0));
				XClearWindow(display,mainwin);

        if (acstate==-1) {
          fore_color.red=65535; fore_color.green=0; fore_color.blue=0;
          fore_color.flags=DoRed|DoGreen|DoBlue;
          XAllocColor(display,DefaultColormap(display,DefaultScreen(display))
					  ,&fore_color);
          XSetForeground(display,mw_GC,fore_color.pixel);
				}
        XSetFont(display,mw_GC,rem_font->fid);
				i=sprintf(strbuf,"%3d%%",remain);
        XDrawString(display,mainwin,mw_GC,2,11,strbuf,i);
        if (acstate==-1)
          XSetForeground(display,mw_GC,XBlackPixel(display,0));
        XSetFont(display,mw_GC,mw_font->fid);
				i=sprintf(strbuf,"%3.0f°C",cputemp);
        XDrawString(display,mainwin,mw_GC,2,21,strbuf,i);
				i=sprintf(strbuf,"%3.1f GHz",cpufreq/1000000);
        XDrawString(display,mainwin,mw_GC,2,31,strbuf,i);

        fore_color.red=65535; fore_color.green=0; fore_color.blue=0;
        fore_color.flags=DoRed|DoGreen|DoBlue;
        XAllocColor(display,DefaultColormap(display,DefaultScreen(display))
  			  ,&fore_color);
        XSetForeground(display,mw_GC,fore_color.pixel);
        XDrawLine(display,mainwin,mw_GC,0,0,WIDTH-1,0);
        XDrawLine(display,mainwin,mw_GC,WIDTH-1,0,WIDTH-1,HEIGHT-1);
        XDrawLine(display,mainwin,mw_GC,WIDTH-1,HEIGHT-1,0,HEIGHT-1);
        XDrawLine(display,mainwin,mw_GC,0,HEIGHT-1,0,0);
        XDrawLine(display,mainwin,mw_GC,WIDTH-1,CLOSEBTNSZ,WIDTH-1-CLOSEBTNSZ,
				  CLOSEBTNSZ);
        XDrawLine(display,mainwin,mw_GC,WIDTH-1-CLOSEBTNSZ,CLOSEBTNSZ,
				  WIDTH-1-CLOSEBTNSZ,0);
        XDrawLine(display,mainwin,mw_GC,WIDTH-1-CLOSEBTNSZ,0,WIDTH-1,
				  CLOSEBTNSZ);
        XDrawLine(display,mainwin,mw_GC,WIDTH-1,0,WIDTH-1-CLOSEBTNSZ,
				  CLOSEBTNSZ);

        XFreeGC(display,mw_GC);
				needrefresh=0;
        break;
			case ButtonPress:
			  if ((ev.xbutton.button==Button1)&&(ev.xbutton.x<WIDTH-1)&&\
				(ev.xbutton.x>WIDTH-1-CLOSEBTNSZ)&&(ev.xbutton.y<CLOSEBTNSZ)&a
mp;&\
				(ev.xbutton.y>1)) goto cln_exit; else break;
      case ClientMessage:
        if (ev.xclient.data.l[0]!=del_atom) break; else goto cln_exit;
      case KeyPress:
  		  key=XLookupKeysym((XKeyEvent *)&ev,0);
        if (key!=XK_Escape) break;
				cln_exit:
        XFreeFont(display,rem_font);
        XFreeFont(display,mw_font);
        XCloseDisplay(display);
        return(0);
    }
  }
} 

anonymous
()
Ответ на: комментарий от anonymous

Мой, конечно, тоже не сахар - за 10 минут наел 0:00.10. Но это всё-таки в 10 раз меньше, чем у gkrellm. И наверняка можно ещё что-то подоптимизировать, но я чайник...

anonymous
()

> Вышла новая версия популярного мониторинга за системой.

Да, русская языка вельми сложна. Мониторинг - системы, а "за системой" - разве что подглядывание.

anonymous
()
Ответ на: комментарий от anonymous

[denis@ogion denis]$ ps -aux |grep gkrellm; date
denis     2506  0.0  1.0 14132 8228 ?        S    20:42   0:01 gkrellm --sm-client-id 110a030c6b000111577884100000023790004
Сбт Май 14 23:02:55 NOVST 2005

anonymous
()

Видимо нужно напомнить что gkrellm не только мониторинг за системой. Это - многофункциональная панель. Монтирование дисков и погода на улице - всё в одном месте. И не надо впаривать про загрузку проца. Если отключить лишние датчики - она практически нулевая.

anonymous
()
Ответ на: комментарий от anonymous

> Видимо нужно напомнить что gkrellm не только мониторинг за системой. Это - многофункциональная панель. Монтирование дисков и погода на улице - всё в одном месте. И не надо впаривать про загрузку проца. Если отключить лишние датчики - она практически нулевая.

Я его для чичтоты эксперимента запускал в состоянии поставки - т.е. всё по дефолту. Сейчас попробую отключить лишнее. Но вообще - собрал wmpower (он показывает только необходимое вроде как), так он уже за 5 минут съел 0:01.10. Вообще ни в какие ворота...

anonymous
()
Ответ на: комментарий от anonymous

Ну вот. Оставил только Enable Battery (обновление - каждые 5 сек.) и thermal_zone\THRM. За 10 минут съедено 0:00.43. Т.е. полегчало. Похоже, у меня ACPI кривой какой-то.

anonymous
()
Ответ на: комментарий от anonymous

$ ps -aux |grep gkrellm
vovans 2742 0.5 1.6 16812 8352 tty2 S May10 33:09 gkrellm

Показывает лишь загрузку проца и индикатор сети, если та активна...

vovans ★★★★★
()
Ответ на: комментарий от vovans

Господа, вы указывайте время, прошедшее с момента запуска gkrellm (хоть примерно). А то непонятно - 2 года он у вас уже пашет или только 2 минуты.

anonymous
()
Ответ на: комментарий от vovans

$ uptime 22:08:18 up 1:51, 1 user, load average: 0.07, 0.04, 0.01

14343 0.0 1.7 15160 9084 ? S 21:36 0:01 gkrellm

Сеть, xkb, clock, мемори юзадж, програм-ланчер

anonymous
()
Ответ на: комментарий от anonymous

> Всё хорошо, но батарею не показывает. А у меня ещё и температуру определить не может, нули рисует.

Тююююю.... Он её, глупенький, в /sys/devices/temperatures/cpu_temperature ищет. Нет у меня там вообще каталога "temperatures", я её через /proc определяю.

anonymous
()
Ответ на: комментарий от anonymous

Время? Минут на 10-15 спешит... Чтобы меньше опаздывать в универ ;)

vovans ★★★★★
()

Извините, но ... а нафига вообще нужно это поделие ? Я по-приколу начитавшись LORа поставил оное себе и снес на следующий день - нафиг оно не нужно

Разрадку батарей можно и более легкими тулзами смотреть, а наблюдать график загрузки проца или сетевухи - а для чего вообще ? На desktop'ной-то машине ?

А погоду я могу и в окно посмотреть ... LOL

anonymous
()
Ответ на: комментарий от anonymous

>наблюдать график загрузки проца или сетевухи - а для чего вообще ? На desktop'ной-то машине ?

Не только сетевухи, но и модема... Зачем? Всегда видно, загружен проц или нет. т.е. всегда можно определить, закончился ли какой-либо процесс... чтобы не лазать по все раб столам и проверять это н"на лицо" ;) Да и когда трафика не валом, то можно и следить за его утечной.

Короче, у каждого свои задачи. Что тут может вызывать непонимание?

vovans ★★★★★
()
Ответ на: комментарий от anonymous

> а нафига вообще нужно это поделие ?

На desktop - радио и xmms слушать через плагин (не знаю я тоже снёс) :-)

> наблюдать график загрузки проца или сетевухи
НЖМД наблюдать тоже неплохо на серваке

bochs ★★★
()
Ответ на: комментарий от anonymous

> Всё хорошо, но батарею не показывает. А у меня ещё и температуру определить не может, нули рисует.

Настроил я его. Всё он умеет, просто надо ковырять ~/.torsmorc. И чем он меня добил окончательно - после 14 секунд показал в top'е всего 0:00.11! И это при:
TEXT
${color grey}Battery:$color ${battery BAT1}, ${color grey}AC Adapter:$color ${ac
piacadapter}
${color grey}CPU:$color ${acpitemp}°C${color grey} - MB:$color ${i2c temp 2}°C
${color grey}Uptime$color $uptime
${color grey}RAM Usage:$color $mem/$memmax - $memperc% ${membar 6}
${color grey}Swap Usage:$color $swap/$swapmax - $swapperc% ${swapbar 6}
${color grey}CPU Usage:$color $cpu% ${cpubar 6}
${color grey}Processes:$color $processes ${color grey}Running:$color $running_p
rocesses
${color grey}Network Up:$color ${upspeed eth0} k/s${color grey} - Down:$color ${
downspeed eth0} k/s

Всё, перехожу на него, нах все эти gkrellm'ы!

Единственная проблема - не могу его заставить перерисовывать свой background при "own_window no". Но это не принципиально.

anonymous
()
Ответ на: комментарий от anonymous

> после 14 секунд показал в top'е

После 14 минут, конечно

anonymous
()
Ответ на: комментарий от anonymous

>Да, русская языка вельми сложна. Мониторинг - системы, а "за системой" - разве что подглядывание.

во блин, пацан впервые _сам_написал_новость_ и надо же, так обосраться=)

anonymous
()
Ответ на: комментарий от anonymous

>А кто? Простой холоп?

Да и в холопы я не не гожусь А тебя прикалывает только та система, где господа и холопы7 Ты по-другому жить не хочешь? Ню-ню...

vovans ★★★★★
()
Ответ на: комментарий от vovans

> Да и в холопы я не не гожусь А тебя прикалывает только та система, где господа и холопы7 Ты по-другому жить не хочешь? Ню-ню...

А как тебя называть? Товарищ? Гражданин?

anonymous
()
Ответ на: комментарий от vovans

Ты коммунист? Прости, Вованс Ильичс, не узнал-с :)))

anonymous
()
Ответ на: комментарий от vovans

>Да и в холопы я не не гожусь А тебя прикалывает только та система, где господа и холопы7 Ты по-другому жить не хочешь? Ню-ню...

Да мне пофиг. Просто странно видеть человека которому не нравится когда его уважительно называют "господин".

anonymous
()
Ответ на: комментарий от anonymous

>Всё, перехожу на него, нах все эти gkrellm'ы!

ну ты упертый. Так переходи,тебя никто не уговаривает одуматься,- зачем орать то? :) Уже сколько раз замечали,- gkrellm не только средство мониторинга. и многие это юзают. Я, к примеру,- ланчер програм, переключение раскладок, статистику(дайалап), установку дэйт/тайм, индикацию касплок.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.