Linux Äquivalent zu Windows .cmd

M

McMoneysack91

Gast
Liebe Freunde,

Unter Windows nutzte ich das Erstellen von Scripts für alle möglichen automatisierten Aufgaben mit Hilfe von .cmd Dateien. Unter Linux würde ich das gerne genauso machen. Eine leere Shell Script Datei auf dem Desktop, die ich einfach nur anzuklicken brauche und der Script wird ausgelöst.

Ich zeige hier mal auf, was ich unter Windows laufen habe und was ich bereits unter Linux versucht habe.


Windows .cmd Datei für einen Browser Restart

:loop
start firefox
timeout 3600
taskkill /im firefox.exe
timeout 60
goto loop


Dieser Script bewirkt, dass Firefox geöffnet wird, nach einer Stunde geschlossen wird, dem System 1 Minute Zeit gegeben wird, sich zu fangen und alle verbundenen Prozesse zu beenden und anschließend wird Firefox wieder gestartet etc in einer Endlosschleife. Zum Ausführen muss ich die Datei nur anklicken.

Wie nun etwas Ähnliches unter Linux ausführen? Ich habe es mal mit einer leeren Datei probiert, der ich die Endung .sh gab.

Linux .sh Datei für einen Browser Restart

#!/bin/sh
/usr/bin/firefox-esr
timeout 3600
killall firefox


Das Programm kann ich bislang nur im Terminal ausführen unter bash path/to/file.sh Sodann öffnet der Script auch wirklich Firefox. Bloß das Schließen will nicht. Ich habe es zu Testzwecken schon mit timeout 10 probiert, um zu sehen, ob das Programm geschlossen wird. Ich habe schon mit firefox firefox-esr killall pkill etc probiert.

Wenn ich beim laufenden Firefox einfach im Terminal den Befehl pkill firefox eingebe, wird Firefox auch wirklich geschlossen. Warum der Script nicht bis dahin kommt, ist mir bislang noch ein Rätsel. Weiß jemand Abhilfe?
 
Beim Starten kannst du die PID des neuen Prozesses in einer Variable speichern, später rufst du dann kill mit dieser Variable als Argument auf.
 
Ich denke der while loop ist das richtige für dich.

Bash:
while true

firefox-esr

sleep 3600

done

Ich schau grad mal ob das so korrekt war mit done
sollte hinkommen :-)

Für weitere hinweise und Vorgehensweisen eine Möglichkeit:
https://de.wikibooks.org/wiki/Linux-Praxisbuch/_Shellprogrammierung

ach so, dass der Firefox nach einer Stunde gekillt werden soll hatte ich erst so nicht gelesen :D
ich schau mal
Bash:
while true
do
  firefox-esr &
  firefoxpid=$!
  sleep 3600
  kill $firefoxpid
  sleep 10
done

Achtung, das & nicht vergessen, das habe ich eben noch bearbeitet.
Ich habs noch nicht getestet.

Ok, ich habs nochmal angepasst und aus killall nur "kilL" gemacht, weil das mit der pid was anfangen kann
:(nochmal, es fehlte das do nach while - so hab ichs auch getestet, nur mit kürzerer zeit und einem anderen Programm)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: McMoneysack91
McMoneysack91 schrieb:
#!/bin/sh
/usr/bin/firefox-esr
timeout 3600
killall firefox
wenn du "firefox-esr" startest musst du auch "firefox-esr" killen, evt. mit pfadangabe. schau einfach mit "ps" nach, wie der prozess dort aufgelistet wird.
 
Erstmal riesigen Dank für die so schnellen Reaktionen!

@Alexander2 herzlichen Dank schonmal, dass du dir diese Mühe gemacht hast, mir alles buchstäblich vorzukauen.

Zunächst einmal habe ich die Datei ausführbar gemacht durch chmod +x. Ich habe deinen Script jetzt mal einfach blind kopiert und eingefügt. Rüge mich, falls es nur ein Beispiel war und ich etwas eigenes hätte eintragen müssen.

Leider ist der Script beim Anklicken still - es passiert nichts. Wenn ich diese Datei mittels Terminal bash <datei> ausführe, erhalte ich folgende Fehlermeldung:

/home/nutzer/schreibtisch/firefoxrestarter.sh sh: Zeile 8: Syntaxfehler beim unerwarteten Wort `done'
/home/nutzer/schreibtisch/firefoxrestarter.sh sh: Zeile 8: `done'


Ich habe diesen Script einmal so versucht wie du ihn geschrieben hast und einmal mit #! /bin/bash als erste Zeile. Leider keine Auswirkungen.
 
Wenn in einem Script ein Programm aufgerufen wird, dann wird so lange an der Zeile im Script "verharrt" bis dieses Programm fertig ist, also sich beendet. Deswegen kommst du ab dem Start von Firefox in deinem Beispiel nicht weiter.

Wenn du jedoch nun ein & nach einem Programm aufruf setzt in einem Script oder auch in der Kommandozeile/shell, dann wird dieses Programm/der Befehl im Hintergrund aufgerufen und das Script weiter ausgeführt, egal ob das Programm fertig ist.

Die Variable $! gibt immer die PID des zuletzt aufgerufenen zurück.
Mit der PID kann man nun statt alle Firefox Programme zu beenden eben nur diese eine Instanz killen.

EDIT: ja, zu meiner Schande habe ich das ein paar mal editiert :D bis es dann richtig war. Die jetzige Variante in dem Post habe ich korrigiert und getestet. Wenn ich beim einfügen keinen Fehler gemacht habe sollte das so laufen.
Beim sleep Befehl ist die Zahl eine Angabe in Sekunden.
 
  • Gefällt mir
Reaktionen: lassoheinz und McMoneysack91
Okay dein Script im finalen Stadium ist schonmal großartig. Es führt aus, es öffnet ein Firefox Fenster, wartet (ich habe zum Test erstmal 15 Sekunden eingestellt) und öffnet dann ein weiteres FIrefox Fenster, ohne das vorige zu schließen. Und das dann alle 15 Sekunden ein neues :D

Ich denke ich muss an dem kill Befehl etwas arbeiten, damit das vorherige auch geschlossen wird^^

Und äh...noch eine Frage. Wie beende ich dieses Script? :D Bei Windows öffnet die .cmd Datei ja ein Fenster mit dem cmd Terminal. Schließt man dieses Fenster, hört der Script auf. Hier mache ich ja einen Doppelklick und der Script legt los. Ich musste leider immer den PC neu starten, weil ich den Script nicht angehalten bekam. Es öffnete sich alle 15 Sekunden ein Firefox Fenster :D :D :D
 
das script sollte im Taskmanager deiner wahl zu finden sein.
wenn du das Terminal aufmachst kannst du es starten, laufen lassen und bei bedarf mit [strg]+[c] unterbrechen

Eine weitere Möglichkeit je nach Desktopumgebung, eine Verknüpfung erstellen mit der das Script aufgerufen wird und die Option setzen "Im Terminal ausführen" dann wird bei Start ein Terminal Fenster gleich mit aufgemacht.

ich habs bei mir mit nem taschenrechnerprogramm probiert, das belässt es wohl bei nur einem prozess oder pid - wie auch immer :-) da startet firefox wohl mehr prozesse oder so? Das man das etwas anders beenden muss. mit dazugehörigen PID oder so.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: McMoneysack91
Alexander2 schrieb:
das script sollte im Taskmanager deiner wahl zu finden sein.
Ich hab grad extra nochmal geschaut, wenn man kein #!/bin/bash o.ä. in die erste Zeile setzt, dann wird anscheinend kein eigener Prozess für das Skript gestartet?

Aber ja, sonst mit ps -A o.ä. die pid raussuchen und dann killen, zum Beispiel.
 
ich habe mal "pidof firefox" bei mir ausgeführt, der startet gleich eine ganze reihe an prozessen, womöglich ist das das problem :-) das man dem kill befehl sagen muss irgendwie er soll alles dazugehörige mit beenden:
"
3731460 3602042 3590832 3517942 3517234 3124822 3121351 3121302 3121183 3120931 3120450 31326

"
 
BeBur schrieb:
Ich hab grad extra nochmal geschaut, wenn man kein #!/bin/bash o.ä. in die erste Zeile setzt, dann wird anscheinend kein eigener Prozess für das Skript gestartet?
Korrekt, das muß immer entsprechend gesetzt sein, oder #!/bin/sh. Alternative ist dann, das Script mit sh/bash scriptname zu starten.

Für das Beenden mehrere Prozesse gibts pkill.
Code:
pkill -9 -s firefox
 
@BeBur ich habe gerade mal im Taskmanager bei mir nachgeschaut, (KSysGuard in meinem Fall) und das Script bei mir mal ausgeführt, ich nannte es test.sh
Wenn ich es nun starte taucht auch der Name test.sh genau so in der liste auf, mit der Suchfunktion im Taskmanager schnell zu finden :-)

Aber ich würde damit es einfacher zu beenden ist eine Verknüpfung auf dem Desktop erstellen mit der Option, dass sich ein Terminal dafür öffnen soll, dann ist es einfach erreichbar.

Ach so, stimmt - das #!/bgin/bash hatte ich in dem Codeschnipsel weggelassen :-) aber im eigenen Testscript natürlich schon, es soll ja der richtige Interpreter genutzt werden.
 
  • Gefällt mir
Reaktionen: McMoneysack91
GESCHAFFT

Aber komischerweise erst nachdem ich die Zeile #!/bin/bash entfernt hatte, funktionierte alles einwandfrei. Der Script sieht nun so aus:

while true
do
firefox-esr &
sleep 15
pkill firefox &
sleep 10
done


nicht mehr und nicht weniger. Und funktioniert tadellos. Firefox wird geöffnet, nach 15 Sekunden geschlossen nach weiteren 10 geöffnet, nach 15 geschlossen etc etc pp.

Ich danke allen hier super herzlich für diese rege Mitarbeit! :)
 
  • Gefällt mir
Reaktionen: Innensechskant
Bei pkill firefox & bin ich mir recht sicher, dass da kein & dahinter muss. Eigentlich sollte ja pkill ohnehin schnell fertig werden mit dem beenden von Firefox, das das & überflüssig ist. Wobei es in der Theorie die ziele ja auch nur im Hintergrund zum ausführen setzt und dann gleich zum sleep 10 weitergeht.

Geht ja anscheinend, ist aber unüblich denke ich hinter dem pkill das & zu haben :D - alles gut
 
Alexander2 schrieb:
ich habe mal "pidof firefox" bei mir ausgeführt, der startet gleich eine ganze reihe an prozessen, womöglich ist das das problem :-) das man dem kill befehl sagen muss irgendwie er soll alles dazugehörige mit beenden:
Das sind Child-Prozesse, diese werden beendet, wenn der Parent beendet wird und müssen nicht separat beendet werden.

McMoneysack91 schrieb:
Aber komischerweise erst nachdem ich die Zeile #!/bin/bash entfernt hatte
Diese Zeile ist obligatorisch, fang gar nicht erst an, irgendwas ohne die Angabe der Shell zu haben.
setze chmod +x deinscript.sh und dann einfach ./deinscript.sh eingeben.
 
@Alexander2 stimmt, dass & ist irgendwie mit da reingerutscht. Nach dem Entfernen hat sich nichts groß geändert. Der Script funktioniert tadellos. War also von vorn herein überflüssig hinter dem pkill :)
 
  • Gefällt mir
Reaktionen: Alexander2
madmax2010 schrieb:
Leerzeichen sind offiziell erlaubt.
Laut jemandem auf stackexchange hatte systemd einen Bug, der einen "Exec format error" anzeigt, wenn dort ein Leerzeichen ist. https://unix.stackexchange.com/a/276845
Mit der aktuellen Version konnte ich das selbe Problem nur durch leere Zeilen, oder Leerzeichen vor dem #! erzeugen. Dadurch verliert die sogenannte Shebang-Zeile ihre Gültigkeit und wird zu einer normalen Kommentarzeile. Es liegt dann an dem Programm, welches die Datei ausführen soll, was mit der Datei gemacht wird. In einer interaktiven bash Konsole lässt sich so ein Script zum Beispiel ausführen, aber ein Shell Script sollte immer mit einer solchen Zeile beginnen. Damit ist es eindeutig, welches Programm die Datei interpretieren kann.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: madmax2010
Zurück
Oben