Wenn ich `./command.sh &` ausführe, wird die Hintergrundaufgabe angehalten. Wie kann ich es am Laufen halten?

9

Das ist was ich laufe:

alexandma@ALEXANDMA-1-MBP ./command.sh &
[2] 30374
alexandma@ALEXANDMA-1-MBP
[2]  + suspended (tty output)  ./command.sh

Ich möchte nicht, dass es angehalten wird, ich möchte, dass es im Hintergrund weiterläuft. Ich werde ein paar davon in einer Schleife ausführen, also brauche ich etwas, das so funktioniert.

Wie kann ich es am Laufen halten?

Matt Alexander
quelle
Sie können Cron verwenden, es
möchten
Ich nehme an, du meinst Cron. Wie würde das umgesetzt, um dieses Problem zu lösen?
Matt Alexander
Ich habe hier einmal erklärt, wie man den Bildschirm für den Job verwendet: serverfault.com/questions/466129/restore-ssh-session/…
Valentin Bajrami
Wenn Sie sich nicht für das interessieren stdoutund stderrSie können sie einfach umleiten, um zu /dev/nullmögen./cmd.sh &> /dev/null &
111 ---

Antworten:

7

Es stoppt aus dem angegebenen Grund: Es versucht, auf tty auszugeben. Sie können versuchen , die Ausgabe zu umleiten , wenn ./command.shTräger , die oder den Befehl in einem Lauf tmuxoder screenFenster von seiner eigenen. Z.B

 tmux new-window -n "window name" ./command.sh

und zeigen Sie dann die Liste der Fenster tmux list-windowsan, tmuxmit denen erstellt und an die angehängt wurde tmux attach.

Auf diese Weise wartet das Programm immer noch auf die Eingabe / Ausgabe. Sie können jedoch problemlos Eingaben vornehmen, sobald Sie das entsprechende Fenster aufrufen, und die Ausgabe wird nur ohne Aktivität erfasst.

Anthon
quelle
Vergiss nichtnohup
Sukima
Wenn tmuxdas nicht nötig ist
Anthon
Sie haben meine Frage mit "Es stoppt aus dem angegebenen Grund: Es wird versucht, auf tty auszugeben. Sie können versuchen, die Ausgabe umzuleiten, wenn ./command.sh dies unterstützt"
Matt Alexander
@ MattAlexander Ihr Kommentar scheint unvollständig
Anthon
11

Hinzufügen eines Details zu Anthons Erklärung:

Es ist nicht immer so, dass ein Schreibhintergrundprozess gestoppt wird. Dies hängt von der Terminaleinstellung ab tostop.

stty tostop
stty -tostop

kann verwendet werden, um diese Einstellung umzuschalten. Also , wenn Sie einen Hintergrundprozess zu schreiben , um „ein anderer Prozess des“ Terminal wollen , dann können Sie es am Laufen zu halten , aber nicht brauchen tmux, screenoder ähnliches.

Hauke ​​Laging
quelle
5

Der einfachste Weg, dies zu tun, besteht darin, den Befehl wie folgt auszuführen:

 nohup ./command.sh </dev/null &

Ich füge das nohup hinzu, falls Sie eine SH-Variable (keine CSH-Variable) verwenden und Ihre Sitzung beenden würden.

mdpc
quelle
Dies funktioniert in Zsh im Gegensatz zur sttyLösung .
Melebius
@Melebius Kannst du erklären, warum sttyes nicht funktioniert zsh?
Barmar
@Barmar Leider nicht. Ich weiß nichts mehr über die Beziehungen zwischen sttyund der Hülle. Ich habe gerade diese beiden Lösungen ausprobiert und nohupfür mich gearbeitet.
Melebius
@Melebius Vielleicht verwandt: unix.stackexchange.com/questions/343088/…
Barmar
2

Installieren screen.

Sobald Sie den Bildschirm installiert haben. Führen Sie es aus: # screen (Sie haben einen Begrüßungsbildschirm, wenn Sie es zum ersten Mal starten) Führen Sie Ihren Befehl aus:command.sh

Drücken Sie Ctrl+ aund dann d.

Dadurch wird der auf dem Server gestartete Bildschirm getrennt und Ihr Befehl ausgeführt.

Geben Sie Folgendes ein, um zu diesem Bildschirm zurückzukehren:

screen -r

Maxime D.
quelle
0

Möglicherweise wird dieser Fehler angezeigt, wenn Ihre Shell zsh ist und das Skript aufruft sudound Sie keine gültigen zwischengespeicherten Anmeldeinformationen haben (Sie haben sudo zuvor nicht ausgeführt oder die vorherigen Anmeldeinformationen sind abgelaufen) oder suwenn Sie ein Kennwort eingeben müssen.

Wenn Sie die Ausgabe nicht wie in anderen Antworten erwähnt &beibehalten müssen (z. B. das Ausführen Ihres Skripts ohne tmux oder screen), finden Sie hier einige mögliche Lösungen:

  • Deaktivieren der tty_ticketsoder stellen Sie den timestamp_typezu globalIhrer sudoers - Datei (so dass Sie nicht Ihr Passwort in allen Terminals eingeben müssen) und / oder erhöhen den Wert timestamp_timeout(dies einige gravierende Auswirkungen auf die Sicherheit hat).
  • Führen Sie sudovor dem Ausführen des Skripts einen einfachen Befehl mit aus , damit sudo die in Ihrem Skript gefundenen Anmeldeinformationen zwischengespeichert hat.
  • Ändern Sie Ihr Skript so, dass es weder sudo noch su aufruft.
Victor Dodon
quelle