Автор Тема: Оптимизация на команди  (Прочетена 2469 пъти)

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Оптимизация на команди
« -: Dec 23, 2010, 01:34 »
Здравейте,
     Пиша на С малка програма която да взема през определен период чрез команди състоянието на OS като през интервал време изпълнява команди в shell. Възможно ли е тъйкато знам че самите команди са програми да се направи някаква по директна заявка за състоянието. Как е възможно да се оптимизира този процес?

Поздрави
Активен

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: Оптимизация на команди
« Отговор #1 -: Dec 23, 2010, 01:54 »
Може ли малко по-конкретно?

Трябва да четеш това което връщат в конзолата? Или да провериш дали вече не са стартирани като процеси? Или?

Няма ли да е по-лесно вместо супер-дупер Ц езика да реализираш цялата тази гимнастика с един шел скрипт стартиращ се от cron?
Даже в момента гледам подобно нещо реализирано чрез PHP.
Активен

mobilio - професионални мобилни приложения

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Оптимизация на команди
« Отговор #2 -: Dec 23, 2010, 03:00 »
Няма как на С трябва да е защото е plugin.

Ами да кажем че трябва да се провери колко е свободното пространство но HDD вместо да се изпълнява df -h няма ли друг начин от по-ниско ниво с което да се вземат данните?
Активен

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: Оптимизация на команди
« Отговор #3 -: Dec 23, 2010, 03:42 »
Ами има...

Намираш кода на df и гледаш какво прави -h. Ще е едно парче код от около ~10-тина реда дето си го копираш и преправяш за целите.
Активен

mobilio - професионални мобилни приложения

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Оптимизация на команди
« Отговор #4 -: Dec 23, 2010, 04:23 »
Ok мерси,
    Още един въпрос. При някои комерсиални версии на UNIX се изпълняват същите команди но са с по-различен резултат. Когато нямаме кода в случая на df за да видим какво прави h какво може да се направи.
Активен

borovaka

  • Напреднали
  • *****
  • Публикации: 1331
  • Distribution: Каквото дойде
  • Window Manager: Gnome / KDE
    • Профил
Re: Оптимизация на команди
« Отговор #5 -: Dec 23, 2010, 06:53 »
rcbandit Дай пример за такива дистрибуции ... При RHEL примерно можеш също да си вземеш кода на приложенията без проблеми.
Активен

Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: Оптимизация на команди
« Отговор #6 -: Dec 23, 2010, 11:35 »
Всъщност и комерсиалните дистрибуции правят подобни хватки, но ще трябва да си поиграете малко повечко с тестовете.
Активен

mobilio - професионални мобилни приложения

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Оптимизация на команди
« Отговор #7 -: Dec 23, 2010, 11:38 »
Код
GeSHi (C):
  1. #include <sys/statvfs.h>
  2.  
  3. int main( int argc, char *argv[] )
  4. {
  5.        struct statvfs fiData;
  6.        struct statvfs *fpData;
  7.        char fnPath[128];
  8.        int i;
  9.  
  10.        if( argc < 2 ) {
  11.                printf("Usage, webdisk DEVICE0 ..... DEVICEX\n");
  12.                return(2);
  13.        }
  14.  
  15.        //Lets loopyloop through the argvs
  16.        for( i = 1 ; i<argc; i++ ) {
  17.                strcpy(fnPath, argv[i]);
  18.                if((statvfs(fnPath,&fiData)) < 0 ) {
  19.                        printf("Failed to stat %s:\n", fnPath);
  20.                } else {
  21.                        printf("Disk %s: \n", fnPath);
  22.                        printf("\tblock size: %u\n", fiData.f_bsize);
  23.                        printf("\ttotal no blocks: %i\n", fiData.f_blocks);
  24.                        printf("\tfree blocks: %i\n", fiData.f_bfree);
  25.                }
  26.        }
  27. }

Според мен е грешно да ползваш шел команди в С програма.

PS: Горния код ти дава размера на диска, но може да се преправи.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

solarflux

  • Напреднали
  • *****
  • Публикации: 100
    • Профил
Re: Оптимизация на команди
« Отговор #8 -: Dec 23, 2010, 13:22 »
busybox е реализация на голяма част от функционалността на много от командите необходими да се добие някаква представа за състоянието на дадена система. Голяма част от сорса на busybox според тях самите би трябвало да тръгне без модификации на различни платформи, така че ако търсите малки имплементации на някои основни команди, тяхната версия може би биха били полезни...
Активен

jet

  • Напреднали
  • *****
  • Публикации: 3469
  • Distribution: debian
  • Window Manager: kde
    • Профил
Re: Оптимизация на команди
« Отговор #9 -: Dec 24, 2010, 01:07 »
от някъде ми попадна един скрипт, викаш го с крон-а всяка минута

0 0 * * * /root/info.sh  > /var/www/osstat.html

Код
GeSHi (Bash):
  1. #!/bin/bash
  2. Q_HOST="192.168.1.200 "
  3.  
  4. # SSH USER, change me
  5. USR="jet"
  6.  
  7. # Show warning if server load average is below the limit for last 5 minute
  8. LOAD_WARN=5.0
  9.  
  10. # Your network info
  11. MYNETINFO="My Info"
  12. PBY='Powered by Linux'
  13.  
  14. # font colours
  15. GREEN='<font color="#00ff00">'
  16. RED='<font color="#ff0000">'
  17. NOC='</font>'
  18. LSTART='
  19. <ul>
  20. <li>'
  21. LEND='</li>
  22. </ul>
  23.  
  24. '
  25. # Local path to ssh and other bins
  26. SSH="/usr/bin/ssh"
  27. PING="/bin/ping"
  28. NOW="$(date)"
  29.  
  30. ## functions ##
  31. writeHead(){
  32. echo '<HTML><HEAD><TITLE>Network Status</TITLE></HEAD>
  33. <BODY>'
  34. # <BODY alink="#0066ff" bgcolor="#000000" link="#0000ff" text="#ccddee" vlink="#0033ff">'
  35. echo '<CENTER><H1>'
  36. echo "$MYNETINFO</H1>"
  37. echo "Generated on $NOW"
  38. echo '</CENTER>'
  39.  
  40. }
  41.  
  42. writeFoot(){
  43. echo "<HR><center>$PBY</center>"
  44.  echo "</BODY></HTML>"
  45. }
  46.  
  47. ## main ##
  48.  
  49. writeHead
  50. echo '<TABLE WIDTH=100% BORDER=2 BORDERCOLOR="#000080" CELLPADDING=4 CELLSPACING=4 FRAME=HSIDES RULES=NONE" >'
  51. echo '<TR VALIGN=TOP>'
  52. for host in $Q_HOST
  53. do
  54.  #echo '<TD WIDTH=33% BGCOLOR="#0099ff">'
  55. #  echo '<TD BGCOLOR="#0099ff">'
  56.  echo '<TD >'
  57.  _CMD="$SSH $USR@$host"
  58.  rhostname="$( hostname)"
  59.  
  60.  ruptime="$( uptime)"
  61.  if $(echo $ruptime | grep -E "min|days" >/dev/null); then
  62.    x=$(echo $ruptime | awk '{ print $3 $4}')
  63.  else
  64.    x=$(echo $ruptime | sed s/,//g| awk '{ print $3 " (hh:mm)"}')
  65.  fi
  66.  ruptime="$x"
  67.  
  68.  rload="$( uptime |awk -F'average:' '{ print $2}')"
  69.  x="$(echo $rload | sed s/,//g | awk '{ print $2}')"
  70.  y="$(echo "$x >= $LOAD_WARN" | bc)"
  71.  [ "$y" == "1" ] && rload="$RED $rload (High) $NOC" || rload="$GREEN $rload (Ok) $NOC"
  72.  
  73.  rclock="$( date +"%r")"
  74.  rtotalprocess="$( ps axue | grep -vE "^USER|grep|ps" | wc -l)"
  75.  rfs="$( df -hT | grep -v tmpfs )"
  76.  
  77.  rusedram="$( free -mto | grep Mem: | awk '{ print $3 " MB" }')"
  78.  rfreeram="$( free -mto | grep Mem: | awk '{ print $4 " MB" }')"
  79.  rtotalram="$( free -mto | grep Mem: | awk '{ print $2 " MB" }')"
  80.  
  81.  $PING -c1  $host>/dev/null
  82.  if [ "$?" != "0" ] ; then
  83.    rping="$RED Failed $NOC"
  84.  else
  85.    rping="$GREEN Ok $NOC"
  86.    echo "<b><u>$rhostname</u></b><BR>"
  87.    echo "Ping status: $rping<BR>"
  88.    echo "Time: $rclock<BR>"
  89.    echo "Uptime: $ruptime <BR>"
  90.    echo "Load avarage: $LSTART $rload $LEND"
  91.    echo "Total running process: $LSTART $rtotalprocess $LEND"
  92.    echo "Disk status:"
  93.    echo "<pre> $rfs </pre>"
  94.    echo "Ram/swap status: <pre> $(free -m) </pre>"
  95.  fi  
  96.  
  97.  echo "</td>"
  98.  
  99. done
  100.  
  101.  echo "</tr>
  102. </table>
  103. <pre>
  104. $(/usr/sbin/smartctl -l error /dev/sda)   <hr>
  105. $(/usr/bin/sensors)   <hr>
  106. $(/usr/bin/top -b -d 10 -n 3 | /usr/bin/head -n 35)   <hr>
  107. $(/usr/bin/lspci)   <hr>
  108. $(/bin/cat /proc/cpuinfo)  <hr>
  109.  
  110. </pre> "
  111.  
  112.  
  113. writeFoot
  114.  

отдолу можеш да му добавиш още статистики каквото те вълнува.
/proc/
е пълна с файлове, които директно се четат и може да се парсват с информация от ядрото за твоята система

отваряш html файла с браузъра и четеш
Активен

..⢀⣴⠾⠻⢶⣦⠀
  ⣾⠁⢠⠒⠀⣿⡁
  ⢿⡄⠘⠷⠚⠋
  ⠈⠳⣄⠀⠀⠀⠀  Debian, the universal operating system.

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Оптимизация на команди
« Отговор #10 -: Dec 24, 2010, 01:25 »
Сещате ли се за друг подобен проект като http://www.busybox.net/
Активен

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Re: Оптимизация на команди
« Отговор #11 -: Dec 24, 2010, 01:52 »
Пич - лозето иска мотика.
Активен

mobilio - професионални мобилни приложения

rcbandit

  • Напреднали
  • *****
  • Публикации: 144
    • Профил
Re: Оптимизация на команди
« Отговор #12 -: Dec 24, 2010, 02:07 »
И още нещо
Команда изпълнена върху HP-UX дали е еднаква с команда в Solaris или AIX?
Имате ли представа дали в различните операционни системи командите се пишат еднакво но са с различен сорс код?
« Последна редакция: Dec 24, 2010, 02:11 от rcbandit »
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Оптимизация на команди
« Отговор #13 -: Dec 25, 2010, 02:22 »
И още нещо
Команда изпълнена върху HP-UX дали е еднаква с команда в Solaris или AIX?
Имате ли представа дали в различните операционни системи командите се пишат еднакво но са с различен сорс код?
В общия случай, потърси информация за дефинициите на posix стандарта, старай се да следваш него и тогава конкретната имплементация не те интересува.
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Re: Оптимизация на команди
« Отговор #14 -: Dec 25, 2010, 21:25 »
В повечето случай ( под всички Линукс дистрибуции и предполагам всичко, на което може да се подкара Гном/КДЕ) има помощни библиотеки и демони - UDev, UDisk, Solid, HAL. Повечето то тези библиотеки/демони предлагат API-та и/или D-Bus интерфейси, които може да ползваш. Така приложението ти ще стане няколко реда код.
« Последна редакция: Dec 25, 2010, 21:57 от task_struct »
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg