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?

Alleswissend
quelle

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
Jim L.
quelle
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.

Alleswissend
quelle
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.

zymhan
quelle
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