Wie entferne ich mich von einem steuernden Terminal von der Befehlszeile?

387
Omnifarious

Ich weiß es nohupund tut nicht das, 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, hat der Schlaf immer noch pts/9ein kontrollierendes Terminal. Ich möchte nicht, dass es ein steuerndes Terminal hat. Das liegt zum Teil daran, dass das Programm, das ich verwenden möchte (es ist nicht der Fall, sleepdass Sie es nicht erraten haben), versucht, das steuernde 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?

1

3 Antworten auf die Frage

1
Jim L.

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 das tun. Sie werden wahrscheinlich vermeiden wollen, dass cron den Job wiederholt ausführt. Vielleicht erstellen Sie einen Wrapper um die gewünschte Befehlsliste, z.

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

Inelegant vielleicht für die Produktion, aber wenn Sie nur testen möchten, wie sich Ihr Befehlsstapel ohne steuerndes Terminal verhält, ist dies der Fall. Der Wrapper erlaubt es Cron nicht, den Befehl erneut auszuführen, bis Sie Folgendes tun:

rm /tmp/my-semaphore-file 

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

echo 'my_command_stack > /dev/null 2>&1' | at now+1 minute 
Auch "at now" funktioniert. Das ist besser als mein "Du kannst es nicht tun." Antworten. Omnifarious vor 5 Jahren 0
0
zymhan

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 damit das gewünschte Ergebnis erzielen.

Nein, der Schlaf hat immer noch etwas in der Spalte "TTY". Ich habe es getestet, obwohl ich nicht erwartet hatte, dass "Disown" einen Effekt hat. Das Löschen des steuernden Terminals muss beim Start eines Prozesses AFAIK durchgeführt werden. Omnifarious vor 5 Jahren 0
Ach ja, wenn man sich diesen Beitrag anschaut, scheint es so, als würde disown das nicht beheben: https://superuser.com/questions/1196406/linux-view-and-kill-disowned-process zymhan vor 5 Jahren 0
Diese kleine Befehlszeile führt zu einem `python3'-Prozess ohne steuerndes Terminal:` sh -c 'nohup python3 -c "import os, time; time.sleep (5); os.setsid (); time.sleep (600) ) "& '/ dev / null 2> / dev / null &` Omnifarious vor 5 Jahren 0
0
Omnifarious

Soweit ich das beurteilen kann, lautet die Antwort auf diese Frage, dass dies bei den meisten Linux-Distributionen nicht über die Befehlszeile möglich ist.

Dies ist unter Unix / POSIX / Linux im Allgemeinen möglich, erfordert jedoch eine ganz bestimmte Reihenfolge von Systemaufrufen, an denen mehrere Prozesse beteiligt sind. Und eine Erklärung, warum und wie es erforderlich wäre, Dinge auf Code-Ebene zu erklären, die meiner Meinung nach nicht für Superuser geeignet sind.

Und obwohl es früher Befehlszeilen-Tools gab, die dies tun würden (ich glaube, daemonizewar einer von ihnen), scheinen sie nicht mehr weit verbreitet zu sein. Zumindest packt Fedora sie nicht. Einer der Gründe dafür ist wahrscheinlich, weil dies unter dem Gesichtspunkt interessanter Implikationen von Dingen ist, bei systemddenen die Vorstellung einer Benutzersitzung völlig unabhängig von den Prozessgruppen und Sitzungs-IDs ist, auf die sich die traditionelle, auf Terminals ausgerichtete Jobsteuerung normalerweise verlassen hat.