Portál AbcLinuxu, 9. května 2025 14:30

Bashtop, monitorování systému v Bashi

Bashtop je nástroj s TUI rozhraním pro monitorování systému naprogramovaný v Bashi. Aktuálně má tento skript 3508 řádků.

27.4.2020 16:22 | Ladislav Hagara | Zajímavý software


Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

xkucf03 avatar 27.4.2020 17:07 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Odpovědět | Sbalit | Link | Blokovat | Admin
Inspirativní kód, stojí za přečtení.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
27.4.2020 18:31 debian+
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Odpovědět | Sbalit | Link | Blokovat | Admin
┌─┤resize window├──────────────────────────────────────────────────────────────┐
│                                                                              │
│                                Current size:                                 │
│                                     80x24                                    │
│                              Need to be atleast:                             │
│                                     80x25                                    │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘
27.4.2020 18:33 debian+
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Odpovědět | Sbalit | Link | Blokovat | Admin
Ale vystup to ma pecka.
27.4.2020 21:57 snehulak
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Jj, jak Wolfenstein.
Conscript89 avatar 27.4.2020 22:01 Conscript89 | Brno
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Odpovědět | Sbalit | Link | Blokovat | Admin
To by me teda zajimalo co autora vedlo neco takoveho napsat v bashi, to musi byt cisty masochismus.
I can only show you the door. You're the one that has to walk through it.
cbrpnk avatar 27.4.2020 23:10 cbrpnk | skóre: 8 | blog: bl0gium
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Bash je na to ideálny!
28.4.2020 09:55 debian+
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Mozno ze sa dobre vyzna v BASH velmi dobre a prislo mu to dobra volba. A podla kodu sa v tom BASH vyzna.

Napr. toto napises v BASH casovo rychlejsie v bash, ako v inom programovacom jazyku.
for s in `ls /proc`; do path="/proc/$s/comm"; if [ -e $path ]; then cat $path; fi; done | sort
Josef Kufner avatar 28.4.2020 10:27 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Ale jen o pár znaků (vyber si):
php -r '$c = []; foreach (glob("/proc/*/comm") as $f) { $c[] = file_get_contents($f);}; sort($c); echo join($c);'
php -r '$c = array_map(function($f) {return file_get_contents($f);}, glob("/proc/*/comm")); sort($c); echo join($c);'
... a běží to jen 10× rychleji.
Hello world ! Segmentation fault (core dumped)
cbrpnk avatar 28.4.2020 10:53 cbrpnk | skóre: 8 | blog: bl0gium
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
A teraz niekto JavaScript :-D
28.4.2020 11:30 debian+
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Prekonas aj toto? ;)
cat /proc/*/comm | sort
xkucf03 avatar 28.4.2020 11:41 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi

Jen pozor, že tohle předá názvy všech těch souborů jako argumenty příkazu cat (který se spustí jen jednou), které mají omezenou délku. Ale prakticky by se ti nemělo stát, že bys ten limit překročil, viz:

getconf ARG_MAX

Např. na mém systému to jsou 2 MB.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
28.4.2020 11:50 debian+
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
To je jasne. Ak zlyha, tak to prepisas inac.

Josef Kufner avatar 28.4.2020 11:54 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
A pak mi někdo vykládejte, jak jsou bash skripty spolehlivé.
Hello world ! Segmentation fault (core dumped)
xkucf03 avatar 28.4.2020 11:58 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi

Nějaké limity máš v podstatě všude (přeteče int, naplní se RAM, dojde místo na disku, zahltí se kapacita sítě a začnou se zahazovat pakety atd.) Ono napsat program, který by fungoval za všech okolností, je dost těžké až nemožné.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
28.4.2020 11:58 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Allowed memory size of 2097152 bytes exhausted (tried to allocate 78 bytes) in phptop.php 1

A pak mi někdo vykládajte, jak jsou PHP* skripty spolehlivé.

* při vhodné úpravě chybového hlášení lze vložit jazyk dle volby čtenáře.
Quando omni flunkus moritati
28.4.2020 11:58 debian+
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
cca 200 priecinkov da nasledovne Bajtov:
# echo /proc/*/comm |wc -c
3141
# (cd /proc; ls */comm | wc -c)
1952
28.4.2020 16:33 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi

Neměl by se odfiltrovat self a thread-self, protože už tam jednou je? Třeba brát jenom čísla…

cat /proc/+([0-9])/comm | sort

A kdybychom chtěli cat zavolat „bezpečně“, jak už někteří naznačovali:

find /proc -mindepth 2 -maxdepth 2 -regex '/proc/[0-9]+/comm' -exec cat '{}' + | sort

Nebo kdybychom to chtěli jenom v Bashi, jenom ten sort bychom si ještě dovolili spustit: :-D

for comm in /proc/+([0-9])/comm; do
  echo "$(< "$comm")"
done | sort

Nebo kdybychom to fakt chtěli jenom v Bashi a ani ten sort bychom si nedovolili spustit, tak potom upravíme tohle, aby to bralo stringy, a…

mergesort() {
  local -n -r input_reference="$1"
  local -n output_reference="$2"
  local -r -i size="${#input_reference[@]}"
  local merge previous
  local -a -i runs indices
  local -i index previous_idx merged_idx \
           run_a_idx run_a_stop \
           run_b_idx run_b_stop
 
  output_reference=("${input_reference[@]}")
  if ((size == 0)); then return; fi
 
  previous="${output_reference[0]}"
  runs=(0)
  for ((index = 0;;)) do
    for ((++index;; ++index)); do
      if ((index >= size)); then break 2; fi
      if [[ "${output_reference[index]}" < "$previous" ]]; then break; fi
      previous="${output_reference[index]}"
    done
    previous="${output_reference[index]}"
    runs+=(index)
  done
  runs+=(size)
 
  while (("${#runs[@]}" > 2)); do
    indices=("${!runs[@]}")
    merge=("${output_reference[@]}")
    for ((index = 0; index < "${#indices[@]}" - 2; index += 2)); do
      merged_idx=runs[indices[index]]
      run_a_idx=merged_idx
      previous_idx=indices[$((index + 1))]
      run_a_stop=runs[previous_idx]
      run_b_idx=runs[previous_idx]
      run_b_stop=runs[indices[$((index + 2))]]
      unset runs[previous_idx]
      while ((run_a_idx < run_a_stop && run_b_idx < run_b_stop)); do
        if [[ "${merge[run_a_idx]}" < "${merge[run_b_idx]}" ]]; then
          output_reference[merged_idx++]="${merge[run_a_idx++]}"
        else
          output_reference[merged_idx++]="${merge[run_b_idx++]}"
        fi
      done
      while ((run_a_idx < run_a_stop)); do
        output_reference[merged_idx++]="${merge[run_a_idx++]}"
      done
      while ((run_b_idx < run_b_stop)); do
        output_reference[merged_idx++]="${merge[run_b_idx++]}"
      done
    done
  done
}

stupidsort() {
  local -a input output
  readarray -t input
  mergesort input output
  for line in "${output[@]}"; do echo "$line"; done
}

for comm in /proc/+([0-9])/comm; do
  echo "$(< "$comm")"
done | stupidsort

Uf. Měl bych s takovými ptákovinami přestat. :-D Ale nemohl jsem si pomoct.

Conscript89 avatar 28.4.2020 21:36 Conscript89 | Brno
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
sorted([open('/proc/%s/comm'%file).read() for file in os.listdir('/proc') if os.path.exists('/proc/%s/comm'%file)])

Ma to ale naprosto stejny problem s race condition jako ten bash (overim sice ze soubor funguje ale ouha, on zmizi). Osobne bych neco takoveho v bashi udelal stejne jako Andrej s mirnou modifikaci (zjednoduseni findu a omezeni spousteni cat procesu):

find /proc -maxdepth 2 -path '/proc/*/comm' | xargs cat | sort

Btw. jak tu delate ten barevny kod? :)

I can only show you the door. You're the one that has to walk through it.
Josef Kufner avatar 28.4.2020 21:38 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Btw. jak tu delate ten barevny kod? :)
<pre class="brush: html">...</pre>
Hello world ! Segmentation fault (core dumped)
Conscript89 avatar 29.4.2020 20:13 Conscript89 | Brno
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Diky, diky :)
I can only show you the door. You're the one that has to walk through it.
28.4.2020 23:04 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi

race condition se dá odpomoct tak, že soubory, jejichž čtení nějak selže, se nebudou vypisovat. Pořád ten výpis sice nepředstavuje „atomický snapshot“ adresáře /proc, ale aspoň v něm pak nebudou náhodné chybové hlášky na stderr a prázdné řádky na stdout:

for comm in /proc/+([0-9])/comm; do
  if content="$(< "$comm")"; then
    echo "$content"
  fi 2>/dev/null
done | sort

To původní řešení, ... if [ -e $path ]; then cat $path; fi; ..., je samozřejmě (pokud jde o race condition) taky špatně. Leda že by se někde později (nebo globálně) zahazoval stderr; to by pak dávalo smysl. (Pak ale nemá smysl dávat tam tu podmínku, která nijak nepomáhá. Přivřené race window je pořád race window.)

29.4.2020 15:40 Ivan
Rozbalit Rozbalit vše Re: Bashtop, monitorování systému v Bashi
Odpovědět | Sbalit | Link | Blokovat | Admin
Tohle kdyz se rozbije, tak to uz nikdo neda dohromady.

Založit nové vláknoNahoru


ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.