Aus Skript Befehl ausführen aber nicht warten bis fertig

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
badera
Beiträge: 643
Registriert: 20.05.2004 20:01:50
Wohnort: Schweiz

Aus Skript Befehl ausführen aber nicht warten bis fertig

Beitrag von badera » 20.08.2005 15:01:27

Wie kann man einen Befehl (ein Programm) aus einem Skript heraus ausführen, dabei aber nicht warten, bis die Ausführung des Befehls (Programms) beendet ist?
Beispiel:

Code: Alles auswählen

#!/bin/bash
..
sendEmail ...    <- ein Mail verschicken, aber nicht warten bis fertig verschickt...
...
sendEmail ist ein Perl-Skript (packet sendemail aus testing / SID). Wie kann ich also nun sendEmail aufrufen, sofort aber mit der Ausführung des Skripts weiterfahren?

- Adrian

Benutzeravatar
armin
Beiträge: 2682
Registriert: 17.03.2005 11:49:14

Beitrag von armin » 20.08.2005 15:43:38

Versuch mal ein & anzuhängen - bin mir nicht ganz sicher, könnte aber helfen.
Formerly known as Trigger.
HP 8510p - Debian Sid
Mitglied des Debian-KDE-Teams

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 20.08.2005 17:48:33

Ja, & ist das Zeichen deiner Wahl.

Benutzeravatar
badera
Beiträge: 643
Registriert: 20.05.2004 20:01:50
Wohnort: Schweiz

Beitrag von badera » 20.08.2005 22:21:34

ja, danke, genau das hab ich gesucht. :)

Allerdings geht es trotzdem nicht so, wie ich möchte :cry:
Offenbar gibt es Beschränkungen; und eine davon ist, dass sich eine SSH-Session solange nicht beenden lässt, bis auch alle mit "&" ausgeführten Befehle im Skript fertig sind. Und genau das wollte ich eben nicht. Kann man das nicht auch noch hinbiegen?
- Adrian

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 20.08.2005 22:51:03

mit einem vorangestelltem "nohup" sollte das gehen
Gruß
gms

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 21.08.2005 04:53:51

Alternativ ~. eingeben, dann beendet sich die SSH, die Jobs laufen weiter.

Oder noch besser, screen installieren und dadrin laufen lassen.

Benutzeravatar
badera
Beiträge: 643
Registriert: 20.05.2004 20:01:50
Wohnort: Schweiz

Beitrag von badera » 21.08.2005 17:59:19

mit einem vorangestelltem "nohup" sollte das gehen
Das geht wohl leider nicht so.
Alternativ ~. eingeben, dann beendet sich die SSH, die Jobs laufen weiter.
Wie genau? Kannst Du ein Beispiel machen? Ich weiss nicht genau, wo dass ~. einzugeben ist.
Oder noch besser, screen installieren und dadrin laufen lassen.
Hmm, screen wäre ja schon vorhanden... Ich muss mich aber noch schlau darüber machen, wie dass man dann screen mitteilt, dass es sich beenden soll, sobald der aufgetragene Befehl auch fertig ist. Oder hat jemand gerade ein Beispiel?

Jedenfalls Euch ein grosses Danke für die Hilfe!
- Adrian

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 21.08.2005 18:07:09

badera hat geschrieben:Ich weiss nicht genau, wo dass ~. einzugeben ist.
Einfach beim Prompt, das ~ wird nicht angezeigt, da es ein SSH-Escape ist:

Code: Alles auswählen

ssh foo@bar
Welcome to bar
$ sleep 10&
$
[~. drücken]
Connection to bar closed

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.08.2005 18:24:30

badera hat geschrieben:
mit einem vorangestelltem "nohup" sollte das gehen
Das geht wohl leider nicht so.
Das geht wohl schon so
man nohup hat geschrieben: NAME
nohup - Ein Kommando immun gegen Aufhängen laufen lassen, mit Ausgabe
in ein Nicht-Terminal

Benutzeravatar
badera
Beiträge: 643
Registriert: 20.05.2004 20:01:50
Wohnort: Schweiz

Beitrag von badera » 21.08.2005 18:40:22

hmm, wie geht denn das? Wenn ich folgendes eingebe:
nohup cp Datei1 Datei2
ist die Konsole belegt, kann nicht anderes machen. oder
nohup cp Datei1 Datei2 &
dann kann ich wohl wieder andere Dinge machen, aber wenn ich exit eingebe, dann steht solange "logout", bis auch das Kopieren der Datei fertig ist.
- Adrian

DerDom
Beiträge: 13
Registriert: 09.08.2005 20:32:50
Kontaktdaten:

Beitrag von DerDom » 21.08.2005 19:00:04

evtl. ist

Code: Alles auswählen

screen -d -m <kommando>
das was du willst

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.08.2005 19:12:24

badera hat geschrieben:aber wenn ich exit eingebe, dann steht solange "logout", bis auch das Kopieren der Datei fertig ist.
Wenn das System schwer beschäftigt ist, kann das Logout auch schon mal länger brauchen. Versuche es einmal mit einer sehr großen Datei oder mit einem länger laufenden Prozeß und du wirst erkennen, daß das Logout nicht auf die Beendigung des Befehls wartet

Gruß
gms

Benutzeravatar
badera
Beiträge: 643
Registriert: 20.05.2004 20:01:50
Wohnort: Schweiz

Beitrag von badera » 21.08.2005 19:51:45

sorry, dass ich immer wieder widerspreche. Vielleicht versteh ich Dich falsch, aber auch

Code: Alles auswählen

server:~# nohup sleep 60 &
ergibt das:

Code: Alles auswählen

[1] 11339
nohup: appending output to `nohup.out'
server:~# exit     <- anschliessend eingeben
logout
anschliessend bleibt "logout" genau stehen, bis die Minute durch ist, und erst dann wird das Terminalfenster geschlossen...
- Adrian

Benutzeravatar
falx
Beiträge: 199
Registriert: 03.03.2003 15:12:09
Wohnort: Konstanz
Kontaktdaten:

Beitrag von falx » 21.08.2005 20:54:13

Hi,

also ich hatte mal genau das gleiche Problem. Wenn ich mich recht entsinne, hat

Code: Alles auswählen

 & >/dev/null 2>&1
angehängt an den Befehl funktioniert.

Habs grad getestet: Mit sleep 60 klappts nicht, aber zB mit mldonkey.

-- falx
There are two things in the world I hate the most: People intolerant to other peoples distros... and SuSE.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.08.2005 22:35:47

badera hat geschrieben:sorry, dass ich immer wieder widerspreche.
Du hast ja recht wenn du begründet widersprichst. :wink:
Damit die ssh-Verbindung terminieren kann, dürfen die aufgerufenen Programme keine Verbindung zu Standard Input/Output/Error (stdin,stdout,stderr) der ssh-Session haben. Die Umleitung von Standard Output übernimmt "nohup", die anderen (also stderr und stdin) müssen je nach Kommando zusätzlich umgeleitet werden.

Beim "sleep" Kommando muß stdin umgeleitet werden:

Code: Alles auswählen

gms@gms1:~$ nohup sleep 60 </dev/null &
[1] 26690
gms@gms1:~$ nohup: hänge Ausgabe an ,,nohup.out" an
gms@gms1:~$ exit
logout
Connection to localhost closed.
gms@gms1:~$ ps -ef | grep sleep
gms      26690     1  0 22:26 ?        00:00:00 sleep 60
gms      26704 25081  0 22:26 pts/0    00:00:00 grep sleep

Gruß
gms

Benutzeravatar
badera
Beiträge: 643
Registriert: 20.05.2004 20:01:50
Wohnort: Schweiz

Beitrag von badera » 22.08.2005 09:14:01

Ah, OK, danke für die Infos :)
- Adrian

Antworten