Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: GUI pro spouštění skriptů - poradí někdo?  (Přečteno 2153 krát)

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #25 kdy: 30 Října 2024, 18:53:54 »
Tukam z mobilu v praci. Ano okno se objevi az po dokonceni riidici logiky. Dej za spoustene skripty & Tim by se meli spustit na pozadi a nebude se na ne cekat.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #26 kdy: 30 Října 2024, 21:16:01 »
Jo, okno se po přidání &  už nezavírá, skvělé. Přesná syntaxe je
Kód: [Vybrat]
./konkretni_skript.sh & (to jen kvůli mezerám a kolik, kdo to má vědět ;-) )

Nově se (asi logicky?) okno zavřelo po stisku tlačítka "SOUBKONEC", protože se příslušným subskriptem zabíjely procesy cat a bash, ale to jsem vyřešil omezením na zabití cat, takže teď už se zdá, že to dělá všechno co má...

Díky moc.

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #27 kdy: 31 Října 2024, 00:36:30 »
Není zač.
Ještě doplním že si můžeš uložit pid procesu na pozadí a ten dle potřeby zabít. To jen aby sis zbytečně nezabíjel všechny caty a bashe atd.
Otestuj si to:
Kód: [Vybrat]
./testodeslsoub.sh &
POSLEDNI_PID=$!
kill -9 $POSLEDNI_PID
No a ještě doporučuju ten shebank napsat již spousty let po novu:
Kód: [Vybrat]
#!/usr/bin/env bash
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #28 kdy: 31 Října 2024, 10:48:46 »
Ramael: jo, já jsem taky uvažoval o zabití dle konkrétního PID, ale popravdě moc nechápu funkci toho kódu, co jsi poslal výše (tím spíš, že je nějak spojený se subskriptem testodeslsoub.sh - ten se napřed spustí a pak hned zabije???).

Smyslem subskriptu testkonecodesl.sh je ukončit cat (předtím spuštěný subskriptem testodeslsoub.sh), pokud přenos trvá příliš dlouho (ale myslím, že Tobě to je jasné)...

Při experimentech s PID se trochu obávám, aby se PID nějak nezměnil, chybně určil apod. a nezabilo se něco jiného. Proces cat s největší pravděpodobností poběží vždy jen jeden (ten spuštěný subskriptem testodeslsoub.sh), čili nebude moc hrozit, že by se zabily i nějaké další. Místo pkill jsem nyní použil killall, aby to "náhodou" nezabilo i jiný proces s názvem obsahujícím podřetězec "cat" (pokud správně chápu výklad funkce pkill).

Ten shebang jsem už včera přepsal podle toho, jak to máš (tedy "po novu", jakkoliv novinky čím dál víc nesnáším), někde jsem se dočetl, že to nějak usnadňuje hledání proměnných či co. No prostě pracuje mi to i s tímto "po novu" způsobem...

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #29 kdy: 31 Října 2024, 11:19:06 »
Kousek z řídící logiky
Kód: [Vybrat]
SOUBOR) ./testodeslsoub.sh &
    PID_NA_ZABITI=$!
    # uloží se pid posledního skriptu spuštěného na pozadí
    # takže si ten pid uložíme hned po spuštění
     ;;
 SOUBKONEC) kill -9 $PID_NA_ZABITI
    # místo stop skriptu rovnou zamorduje skript ./testodeslsoub.sh
     ;;
Ten pid se v rámci běžícího procesu nemění. Bude jiný až při dalším spuštění. A tak se hodnota pidu uloží hned po spuštění. A pak už můžeš proces(skript) kontrolovat pomocí té proměnné.

"Po novu" už je to více jak deset let :)
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #30 kdy: 31 Října 2024, 13:43:02 »
Díky, takhle už je kód jasnější, zkusím to tam změnit.

Edit: vyzkoušeno, bohužel verze s pid nezastaví odesílání souboru (zabije to totiž jen proces bash a cat zůstane v běhu). Asi by se musely identifikovat pidy jak bash, tak cat (při spuštění subskriptem přímo v něm) a zabít je pak v hlavním skriptu oba, ne?

Ale nemusíme to hrotit, ta verze s killall cat funguje, jak už jsem psal výše a pro moje účely úplně stačí.
« Poslední změna: 31 Října 2024, 17:48:10 od JirkaZ »

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #31 kdy: 01 Listopadu 2024, 23:19:47 »
No jo no, chybička se vloudila. Takže oprava:
Kód: [Vybrat]
SOUBKONEC) pkill -9 -P $PID_NA_ZABITI
Z man stránky:
Kód: [Vybrat]
man --pager='less -p "-P,"' pkill
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #32 kdy: 01 Listopadu 2024, 23:28:02 »
@Ventero ten YAD vypadá hodně dobře. Tady je to co chceš: https://yad-guide.ingk.se/notebook/yad-notebook.html
Protože Bash není zrovna moc intuitivní jazyk. Je určen na správu systému, proto krkolomná syntaxe. Tak ti přeju ať tě nepostihne šílenství při vytváření si vlastního GUI.
Myslím že by bylo lepší se naučit nějaký normální programovací jazyk.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

Ventero

  • Závislák
  • ***
  • Příspěvků: 3657
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #33 kdy: 02 Listopadu 2024, 08:18:31 »
Diky. Mrknu na to
Zvuky jsou mantrami a myšlenky moudrostí, prostě proto, že se mohou objevovat ...

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #34 kdy: 02 Listopadu 2024, 20:34:32 »
Díky za opravu, takhle už to zabije bash i cat, ale nesmí se (třeba omylem) stisknout tlačítko SOUBOR víckrát. To se pak catů i bashů spustí několik a tlačítkem SOUBKONEC se dá zabít pouze jedna dvojice (logicky).

Když nezabíjím dle pidu, ale dle názvu, tak to funguje lépe (prostě to zabije - třeba i postupně - všechny procesy bash a cat).

Mně je jasné, že by tam asi šlo postupně načítat více pidů dle počtu (nechtěných) spuštění, ale vážně to nemá smysl dál komplikovat, mně ta funkce verze s killall dle názvu zcela vyhovuje. Leda že bys to měl jako dobrovolné mozkové cvičení ;-)

No jo no, chybička se vloudila. Takže oprava:
Kód: [Vybrat]
SOUBKONEC) pkill -9 -P $PID_NA_ZABITI
« Poslední změna: 03 Listopadu 2024, 09:45:53 od JirkaZ »

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #35 kdy: 03 Listopadu 2024, 07:22:23 »
To znělo jako výzva :))
Kód: [Vybrat]
SOUBOR)
    # Pokud už není PID, spusť skript
    # Předejde se vícenásobnému spuštění
    if [[ ! $PID_NA_ZABITI ]]; then
      # skript je spuštěn na pozadí.
      # Po ukončení se automaticky vymaže proměnná PIDu
      ./testodeslsoub.sh & PID_NA_ZABITI=
      # Ale než se ukončí, nastavíme proměnnou na jeho PID
      PID_NA_ZABITI=$!
    fi
    ;;
  SOUBKONEC)
    # Test jestli existuje spuštěný proces
    # Jinak bysme mohli zabít komplet DE - vlastní
    # zkušenost je těžko přenositelná :D
    if [[ $PID_NA_ZABITI ]]; then
      # Výpis všech potomků zabíjeného skriptu
      # A rovnou jejich zabití - tím se skript ukončí
    pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
    # Vymazání hodnoty PIDu
    PID_NA_ZABITI=
    fi
    ;;
On totiž i ten pkill není tak dokonalý jak se tváří.
Takhle je to ošetřené proti ukliknutím.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #36 kdy: 04 Listopadu 2024, 12:19:28 »
Potvrzuju funkci po této poslední opravě, jsi vážně dobrej, díky.

Edit: hm, tak zase to není úplně ono ;-) Pokud nechám přenos souboru doběhnout přirozeně do konce (tedy nezabiju ho tlačítkem SOUBKONEC), tak nelze spustit nový přenos. Tlačítko SOUBOR "nějak" zareaguje (obvyklým zmizením okna Zenity na velmi krátký okamžik), ale to je všechno... Zatím jsem se nedíval do správce procesů, co běží a co ne.

Edit #2: tak běžet zůstane pouze jeden bash (ten, co v něm bylo spuštěno okno Zenity), bash i cat pocházející ze subskriptu pro přenos se zabijí. Nicméně přenos souboru nelze spustit znovu (po zavření okna a novém spuštění už ano).

Edit #3: pomůže, když tlačítko SOUBKONEC stisknu i poté, co přenos doběhl přirozeně (resp. přes to). Ve správci procesů ale není přitom vidět žádná změna...

Původní verze s killall a jmény procesů tímto neduhem netrpí.

Neber to jako výzvu, jen prostě popisuju realitu.

Doplňuju příslušný kód:

Kód: [Vybrat]
#! /usr/bin/env bash
# autor principu: ramael (https://forum.ubuntu.cz/index.php?topic=86616.0)
# úprava vedoucí k zabití celého skriptu místo procesu cat

navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
      --text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
      --extra-button MAZÁNÍ \
      --extra-button MOŽNOSTI \
      --extra-button VYPLŇH \
      --extra-button SETUP \
      --extra-button SOUBOR \
      --extra-button SOUBKONEC \
      --ok-label ZAVŘÍT_OKNO\
       )
  navrat=$?

# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
    ;;
VYPLŇH) ./testh.sh &
    ;;   
MOŽNOSTI) ./testmozn.sh &
    ;;
SETUP) ./testsetup.sh &
    ;;
SOUBOR)
    # Pokud už není PID, spusť skript
    # Předejde se vícenásobnému spuštění
    if [[ ! $PID_NA_ZABITI ]]; then
      # skript je spuštěn na pozadí.
      # Po ukončení se automaticky vymaže proměnná PIDu
      ./testodeslsoub.sh & PID_NA_ZABITI=
      # Ale než se ukončí, nastavíme proměnnou na jeho PID
      PID_NA_ZABITI=$!
    fi
    ;;
  SOUBKONEC)
    # Test jestli existuje spuštěný proces
    # Jinak bysme mohli zabít komplet DE - vlastní
    # zkušenost je těžko přenositelná :D
    if [[ $PID_NA_ZABITI ]]; then
      # Výpis všech potomků zabíjeného skriptu
      # A rovnou jejich zabití - tím se skript ukončí
    pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
    # Vymazání hodnoty PIDu
    PID_NA_ZABITI=
    fi
    ;;
esac
done
« Poslední změna: 07 Listopadu 2024, 10:57:58 od JirkaZ »

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #37 kdy: 06 Listopadu 2024, 21:34:31 »
No jo, jsou věci...
A pak jsou opravy:
Kód: [Vybrat]
SOUBOR)
    # Pokud už není PID, spusť skript
    # Předejde se vícenásobnému spuštění
    if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
      # skript je spuštěn na pozadí.
      ./testodeslsoub.sh &
      # Nastavíme proměnnou na jeho PID
      PID_NA_ZABITI=$!
    fi
    ;;
A ještě pro jistotu:
začátek skriptu:
Kód: [Vybrat]
#! /usr/bin/env bash

PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
...
...
...
a konec skriptu:
Kód: [Vybrat]
...
...
...
esac

done
if [[ $PID_NA_ZABITI ]]; then
  pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
Ty jo, teď už je to kompletně ošetřený. Přidal jsem ještě, že když ukončíš okno, tak to taky zabije ty procesy.

Jak už jsem psal výše, bash není nejlepší jazyk na psaní a obsluhu grafického rozhraní. A řekl bych, že díky jeho složité (krkolomné) syntaxi má pak dost lidí zbytečný strach z normálních programovacích jazyků.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #38 kdy: 07 Listopadu 2024, 10:56:12 »
Můžu Tě požádat, abys ty všechny změny doplnil do předposlední verze skriptu tak, jak jsem ji (pro změnu já) doplnil do předchozího příspěvku?

Ta přehlednost je pro mě totiž opravdu nulová, nebo spíš záporná...

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #39 kdy: 07 Listopadu 2024, 16:36:20 »
Kód: [Vybrat]
#! /usr/bin/env bash
# úprava vedoucí k zabití celého skriptu místo procesu cat

PID_NA_ZABITI=
navrat=1
while [ $navrat -eq 1 ]; do
odpoved=$(zenity --ellipsize --info --title "Test panelu GERCOM" \
      --text="Zvolte funkci (režim SETUP je nutno ukončit vypnutím panelu!)" \
      --extra-button MAZÁNÍ \
      --extra-button MOŽNOSTI \
      --extra-button VYPLŇH \
      --extra-button SETUP \
      --extra-button SOUBOR \
      --extra-button SOUBKONEC \
      --ok-label ZAVŘÍT_OKNO\
       )
  navrat=$?

# Testy odpovědí
case $odpoved in
MAZÁNÍ) ./testmaz.sh &
    ;;
VYPLŇH) ./testh.sh &
    ;;   
MOŽNOSTI) ./testmozn.sh &
    ;;
SETUP) ./testsetup.sh &
    ;;
SOUBOR)
    # Pokud už není PID, spusť skript
    # Předejde se vícenásobnému spuštění
      if [[ ! $PID_NA_ZABITI ]] || [ ! -d /proc/$PID_NA_ZABITI ]; then
      # skript je spuštěn na pozadí.
      ./testodeslsoub.sh &
      # nastavíme proměnnou na jeho PID
      PID_NA_ZABITI=$!
    fi
    ;;
  SOUBKONEC)
    # Test jestli existuje spuštěný proces
    # Jinak bysme mohli zabít komplet DE - vlastní
    # zkušenost je těžko přenositelná :D
    if [[ $PID_NA_ZABITI ]]; then
    # Výpis všech potomků zabíjeného skriptu a jejich zamordování
    pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
    # Vymazání hodnoty PIDu
    PID_NA_ZABITI=
    fi
    ;;
esac
done
# Smyčka byla ukončena. Pokud je ještě skript aktivní
# zamordujem jeho potomky včetně něho samotného
if [[ $PID_NA_ZABITI ]]; then
  pstree -A -p $PID_NA_ZABITI | grep -Eow "[0-9]+" | xargs kill
fi
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

JirkaZ

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 1818
  • Dlouholetý uživatel Linuxu a open source obecně.
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #40 kdy: 07 Listopadu 2024, 19:46:41 »
Tak snad už naposledy za toto díky.

Zdá se, že to už opravdu dělá korektně všechno tak, jak má...

ramael

  • Stálý člen
  • **
  • Příspěvků: 695
Re:GUI pro spouštění skriptů - poradí někdo?
« Odpověď #41 kdy: 07 Listopadu 2024, 22:27:10 »
Nemáš zač.
Mne tyhle věci posouvají dál. A tohle bylo k závěru hodně zajímavé. Vybrat si cestu jakou se dát. Nakonec jsem se rozhodl pro build-in test -d než ps, grep a testy výsledků. Šlo by to udělat i pomocí trap, jenže to bys musel vložit do skriptu který má být pod kontrolou. Ale to odporuje mému přesvědčení o umístění a nedelegování řídící logiky na věci které mají v podstatě vykonávat jen na co byly prvoplánovány.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

 

Provoz zaštiťuje spolek OpenAlt.