Wie trenne ich mich von einem steuernden Terminal über die Befehlszeile?


2

Ich weiß darüber Bescheid nohupund es wird nicht das tun, was ich will:

Beispiel:

$ nohup sleep 600 2>/dev/null >/dev/null </dev/null&
[1] 21844
$ ps -ef | fgrep -e 'sleep
> TTY'
UID        PID  PPID  C STIME TTY          TIME CMD
me       21844 19313  0 09:37 pts/9    00:00:00 sleep 600

Wie Sie sehen können, hat der Schlaf immer noch pts/9ein kontrollierendes Terminal. Ich möchte nicht, dass es ein Kontrollterminal gibt. Zum Teil, weil das Programm, das ich verwenden möchte (nicht, sleepwenn Sie es nicht erraten haben), versucht, das Controlling-Terminal zu öffnen, um mir Fragen zu stellen, und ich möchte sehen, wie es sich verhält, wenn es nicht funktioniert. Wie mache ich das?

Antworten:


1

Dies ist eine FreeBSD-Lösung, aber vielleicht funktioniert eine ähnliche Technik für Ihr Betriebssystem.

Ich weiß, dass cron nicht genau die Befehlszeile ist, aber wenn Sie eine bestimmte Befehlsliste haben, die Sie ausführen möchten, kann cron dies tun. Möglicherweise möchten Sie vermeiden, dass cron den Job wiederholt ausführt, indem Sie beispielsweise einen Wrapper um die gewünschte Befehlsliste erstellen.

#!/bin/sh
[ -f /tmp/my-semaphore-file ] || {
  touch /tmp/my-semaphore-file
  my_command_stack > /dev/null 2>&1
}

Unelegant vielleicht für den produktiven Einsatz, aber wenn Sie nur testen möchten, wie Ihr Befehlsstapel ohne steuerndes Terminal funktioniert, ist dies der Fall. Der Wrapper erlaubt cron nicht, den Befehl erneut auszuführen, bis Sie:

rm /tmp/my-semaphore-file

at(1) ist auch eine Option und "fast" eine Befehlszeilenlösung:

echo 'my_command_stack > /dev/null 2>&1' | at now+1 minute

Funktioniert sogar at now. Das ist besser als mein "Du kannst es nicht machen." Antworten.
Omnifarious

Eine bessere Antwort auf diese Frage ist setsid.
Omnifarious

1

Das Dienstprogramm setsidunter Linux kann dies tun. Auf Fedora ist es Teil des util-linuxPakets. Dies ist das gleiche Paket , das enthält Dinge wie mount, mkfs, /usr/bin/killund andere ähnliche Dinge.


0

Sie müssen auch verwenden disown, um den Prozess vom tty zu trennen.

https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Versuchen Sie zu laufen nohup sleep 600 2>/dev/null >/dev/null </dev/null& disownund sehen Sie, ob Sie das gewünschte Ergebnis erhalten.


Nein, der Schlaf hat noch etwas in der TTYSpalte. Ich habe es getestet, obwohl ich keine disownWirkung erwartet hatte . Das Löschen des steuernden Terminals muss erfolgen, wenn ein Prozess gestartet wird.
Omnifarious

Ah ja auf diesem Posten suchen wäre es , dass disown erscheinen nicht beheben , dass nach all: superuser.com/questions/1196406/...
zymhan

Dieses kleine Kommandozeilen-Ditty führt zu einem python3Prozess ohne Steuerungsterminal:sh -c 'nohup python3 -c "import os, time; time.sleep(5); os.setsid(); time.sleep(600)" &' </dev/null >/dev/null 2>/dev/null &
Omnifarious
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.