Chcem Vas poprosit o radu. Som v Linuxe laik. Potreboval by som poradit, ako by mal vyzerat skript, ktory po kliknuti na neho spusti terminal, bez dalsieho potvrdzovania - vykona co potrebujem a terminal ostane bezat pokym ho sam nezavriem, dakujem za info.
skript-terminal
Pre pridávanie komentárov sa musíte prihlásiť.
To záleží jaký máš instalovaný terminál , na každém linuxu bude vypadat jinak (a nebo se udělá srovnávací databáze která bude kontrolovat nainstalované aplikace a podle toho spustí správný terminál) , xterm má jiné parametry než třeba lx-terminal a pod.
pouzivam Ubuntu MATE, cize mate-terminal
No na ploše uděláš soubor script.desktop a to asi v nějakém editoru textu [Desktop Entry] Name=Script Comment=Můj script Exec=mate-terminal --working-directory="/home/ivan/" --command "bash -c /home/invan/script.sh" Icon=/home/ivan/script.png Terminal=false Type=Application Categories=Utility;Application; vytvoříš si script.sh ve své domovské složce
#!/bin/bash echo "BAF" a nakopíruješ si nějakou ikonu /home/ivan/script.png Netestováno je to jen nástřel , nemam linux po ruce.
dik, tak som to vyskusal a vypisalo mi "Pri spustani programu nastala chyba."
A čo si pod tým predstavujete vojín kefalín?
Mala by to byť len domáca úloha kde sa ti po kliknutí na ikonku otvorí niečo v termináli a ten sa po ukončení nezavre, alebo by to malo samé v piatok o pol desiatej večer spustiť účtovnú uzávierku a poklikať na nejaké tlačítka zatial čo ty budeš na pive a budú ti nabiehať nadčasy?
Ano, presne tak ako pises, potrebujem si nieco zautomatizovat. Script ktory mi spusta danu ulohu mam funkcny, len nanho treba fyzicky kliknut rucne a potvrdit "Spustit v terminali". Moja predstava je taka, ze napriklad kazdych 6hodin sa automaticky zavrie terminal v ktorom uloha bezi a po chvili hned spusti nova a o 6hodin zas, stale dookola. Zatial som si cez "crontab -e" nastavil cas 6hodin, uz len poriesit aby sa ten script sam spustil. Na ukoncenie by som pouzil "killall mate-terminal". Ale ako som uz pisal, v Linuxe som laik, takze len sa snazim nejak dat dokopy ako by to mohlo fungovat. Dakujem za akekolvek info.
Keď zabiješ terminál, tak nemusíš zabiť aj procesy v ňom spustené. Takýto istá problém je aj v iných OS vrátane DOS, OS2 alebo aj Windows, toto nie je špecifikum Linuxu.
Rozumnejšie by bolo buď periodicky spúšťať spracovanie z cronu tak aby zapisovalo výstup do logu, a ten budeš mať bez killovania zobrazený v nejakom termináli. Samozrejmosťou je ošetriť si duplikátny beh.
Ďalšia možnosť je volať ten skript z nekonečnej slučky v tom termináli v ktorej budeš na prázdno čakať cca 6 hodín.
OK, cize spustim tento script
#!/bin/bash
while true
do
echo idem spustit spracovanie o `date`
cd /home/mato/
./moj_script.sh a tu bezi moj script ale on stale bezi, cize tento uz dalej nepokracuje
echo skript ukonceny s navratovym kodom $? o `date` a spim 6 hodin
sleep 6h
done
takze to treba este trochu doladit, hm, mas nejaky napad?
Dopíš na konec skriptu exec bash
A to mu splní ktorú časť požiadavky?
Presne to čo chcel, že sa terminál nezavrie, pokiaľ ho nezavrie on.
mate-terminal /home/matolin/test.sh
Stačí si vyskúšať so skriptom test.sh:
Funguje to v každom emulátore terminálu. Ešte tichší výstup by sa dal spraviť cez:
ono v podstate by sa terminal ani nemusel zatvarat, stacilo by, keby som raz zapol script, hoci rucne a potom by mohol bezat stale a vytvaral by automaticky novy log kazdych 6hodin, ak by bolo treb, tak znovu by som ho vypol rucne. hm.
Vyššie máš takú stále bežiacu slučku s čakačkou 6 hodín.
Ale bedňu som sa pýtal že či si všimol že to nerieši tvoj problém, len to transmutuje na kopec zbytočných okien. I keď na druhú stranu tá požiadavka bola taká.
OK, cize spustim tento script
#!/bin/bash
while true
do
echo idem spustit spracovanie o `date`
cd /home/mato/
./moj_script.sh a tu bezi moj script ale on stale bezi, cize tento uz dalej nepokracuje, ci?
echo skript ukonceny s navratovym kodom $? o `date` a spim 6 hodin
sleep 6h
done
takze to treba este trochu doladit, hm, mas nejaky napad?
Ten prvý otáznik vieš zodpovedať len ty, nik iný nevie ako si naprogramoval
./moj_script.sh
. Druhý otáznik si použil len na zdôraznenie toho prvého.Rekurzívny skript beží aj milión rokov, pokiaľ ho neukončíš, alebo nieje splnená podmienka. Teraz som sa úplne stratil, pretože pôvodná otázka bola iná.
Ty voláš v skripte iný skript? Pokiaľ chceš vedieť, či pôvodný skript čaká na výsledok, tak čaká ak na výsledok čakáš.
Jako fakt to buď napíš konkrétnejšie, alebo to celé hoď na pastebin aby sme vedeli o čom je reč.
Alebo sa pýtaš na to, či keď skript, ktorý spustí iný skript, či ten "nadradený" inak sa tomu hovorí rodíč beží ďalej? Beží ďalej pokiaľ čaká na výsledok svojho potomka, alebo robí iné činnosti ako spúšťanie ďalších skriptov.
OK, podme este raz od zaciatku. Mozno som to zle vysvetlil a medzitym som sa posunul dalej, takze uz sa to zmenilo. Mam funkcny script, ktory som neprogramoval ja, som len obycajny uzivatel. Nazvyme ho "mojscript". Kliknem nanho, potom kliknem spustit v terminaly a otvori sa terminal a vykonavaju sa veci co treba, pritom terminal je stale otvoreny a zobrazuju sa v nom udaje, neviem ako sa to nazyva odborne, vysvetlujem to len tak polopate, cize to stale bezi. Ja som si to chcel trochu zautomatizvat, tak som hladal nieco cez google a podarilo sa mi doplnit do toho scriptu logovanie cez tee s tym, ze po kazdom zapnuti mi vytvori log s datumom a casom v nazve. Toto zatial funguje k mojej spokojnosti. Dalsiu vec co by som chcel doplnit je, aby sa ten log po napr.6hodinach ukoncil a vytvoril sa novy atd. kazdych 6hodin. Cize som si myslel, ze treba vytvorit dalsi script ktory by uzavrel cely ten proces a zacal novy, preto som skusal cron, killall mate-terminal, cize co google dal, hi, ale asi staci ukoncit ten log a spustit nove logovanie, cize mozno len doplnit nejaky prikaz do toho "mojscript". Tak ako som pisal na zaciatku, som v Linuxe laik, len uzivatel, ktory klika na hotove veci, takze sa vam zadaju moje otazky divne, lebo sa v tom velmi nevyznam, ale rad by som si to trochu prisposobil v ramci moznosti ak sa to da, pripadne sa daco priucil, hm.
Mne osobne sa tvoje otázky nezdajú divné. Divná mi príde len formulácia. V odborných kruhoch sa nazýva "neviem presne čo chcem, ale viem ako to dosiahnem".
Nejako stále nerozumiem čo by to malo robiť, a načo je grafický terminál súčasťou skriptu. Ak som ťa pochopil, tak chceš mať log z nejakého spracovania zrolovaný každých 6 hodín aj s reštartom toho skriptu čo zabezpečuje spracovanie. Ak si ten skript neprogramoval ty, tak s tým skús osloviť autora. To bude vzhľadom na definíciu požiadavky najjednoduchšie a najrýchlejšie. Ak by si ovšem vedel zadefinovať čo chceš dosiahnuť, tak to sem kľudne napíš. Bez toho sa nedá pohnúť ďalej.
script sa nemusi restartovat, ak to nieje potrebne, staci mi len aby sa vytvoril samostatny log kazdych 6hodin. Teraz to mam takto
tee logfile_$(date '+%Y-%m-%d-%H-%M').log
ja by som sa to pokusil riešiť tak že do toho hotového skriptu by sa pridal timeout (alebo iný spôsob ukončenia po uplynutí času) na 5h 59m a v crone by som nastavil aby ho spúšťal každých 6h
ten minutovy rozdiel pre istotu, neviem co by sa stalo/mohlo stať ak by sa spustil 2x súbežne (aj keď to sa asi dá ošetriť aj inak)
Možností je veľa. Jedna z nich je preklopiť to na službu, a 4x denne ju reštartovať. SystemD sa postará o ukončenie všetkých dcérskych procesov.
Ale to je asi úplne zbytočné rozoberať pokiaľ človek nevie čo to robí. Tých pár krokov okolo by sa k tomu pridalo. Môj odhad je že tam už jednu nekonečnú slučku má, a v nej spúšťa program čo po vykonaní úlohy skončí. A slučka sa postará o počkanie cez sleep, a znovu spustenie toho spracovania v nekonečnom cykle.
Teoreticky je aj možné v tom jeho skripte volá program čo beží donekonečna, a pracuje len keď má čo. A ten program má zadefinované korektné ukončenie nejakým spôsobom. Aj to som už videl.
A presne toto je dôvod, prečo by mal buď povedať čo chce, alebo kontaktovať pôvodného autora. Akékoľvek riešenie na zle zadanú požiadavku bude mať za následok nepredpokladaný stav.
no ja som si myslel, ze kazdy ukon ktory vykonam ja fyzicky rucne sa da napisat prikazmi v scripte a system to urobi za mna automaticky
cize asi takto:
1. otvor terminal
2. maximalizuj okno
3. spusti script
4. cakaj 6hodin
5. zatvor okno
6. vrat sa na bod 1
to je vsetko co potrebujem
ak sa to neda, kaslite na to
Dá,
ale dorobiť si to do práce už budeš musieť sám. A znova ti opakujem, že to čo chceš ti vytvorí problémy v konzistencii. Ale následky za to si budeš skôr alebo neskôr niesť sám.
na to aby si v pozadi spustil nejaky skript, napríklad cez spomínaný cron, nepotrebujes aby sa ti otvoril terminal
vela linuxovych instalacii je bez grafickeho rozhrania a podmienovat nieco otvorením garickeho emulatora terminalu (lebo to co ti vidis v grafickom prostredí je emulator terminálu) je zbytocne
cron ti zabezpeci ze sa ti pravidelne (pravidelnosť vieš krásne nastaviť) bude spúšťať nejaký príkaz (alebo aj skript), nemusis ho ani prvy krat spustit manualne klikanim ani nic podobne, staci ze ti bude ten system bezat a ten skript sa ti bude sam spustat podla pravidiel nastavených v crone
v skratke body 1.,2. a 5. sú zbytočné skriptovať, ak tvojim cielom je aby ten skript vykonal svoju funkciu a nie aby sa to okno otvorilo (ale to nám stále tajíš - čo je tvojím cieľom)
Ako tu už bolo spomenuté najlepšie riešenie bude cez cron a ty nič manuálne spúšťať nebudeš.
Ak s tým máš problém napíš.