Kann ich verhindern, dass "service foo status" die Ausgabe durch "less" wechselt?

35

Wie stoppen Sie den Befehl service <name> statusverwenden , lessan seinem Ausgang?

Ich habe ein Skript, das einige Sysadmin-Aktionen automatisiert, und nachdem ich meinen Server auf Ubuntu 16.04 aktualisiert habe, bricht es ab, weil Aktionen, die den Dienststatus überprüfen, blockieren, weil sie so etwas wie lessdie Ausgabe anzeigen, insbesondere den supervisorDienst.

Ich habe mehrere Daemons für die Ausführung konfiguriert und beim Ausführen sudo service supervisor statuserhalte ich:

* supervisor.service - Supervisor process control system for UNIX
   Loaded: loaded (/lib/systemd/system/supervisor.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-02-06 20:35:34 EST; 12h ago
     Docs: http://supervisord.org
  Process: 18476 ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown (code=exited, status=0/SUCCESS)
 Main PID: 20228 (supervisord)
   CGroup: /system.slice/supervisor.service
           |- 7387 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7388 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7389 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7390 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7391 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7392 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7393 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7394 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7395 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7396 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7397 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7398 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7678 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7679 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7680 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7681 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7682 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7683 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7684 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7685 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7693 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7694 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7698 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7702 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7703 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7705 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7707 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7709 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7710 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7712 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7713 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7717 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7720 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7723 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7724 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7728 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7730 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7731 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7733 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7734 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7735 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7738 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7743 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7747 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7748 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7750 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7752 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7756 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7758 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7761 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7763 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7764 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7772 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7781 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7785 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7794 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7799 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7801 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
           |- 7805 /usr/local//myproject/.env/bin/python2.7 /usr/local//myproject/.env/bin/celery worker -A /myproject -l info --autoreload
lines 1-66

Und es kehrt nicht zurück, bis ich manuell nach unten scrolle oder drücke, um Qzu beenden. Wie deaktiviere ich diese Funktion?

Cerin
quelle

Antworten:

54

Ubuntu ist ein systemd-System, bei dem der service statusBefehl tatsächlich aufruft systemctl status, und systemctl hat eine --no-pagerOption, die genau das tut, wonach Sie suchen. Daher ist es möglicherweise besser, den direkten Befehl systemctl in Ihrem Skript zu verwenden.

sudo systemctl --no-pager status supervisor

EDIT: env var SYSTEMD_PAGER

Eine andere Möglichkeit, auf die @jwodder hingewiesen hat, besteht darin, die Umgebungsvariable SYSTEMD_PAGER festzulegen. Dies hat den zusätzlichen Vorteil, dass es sich auch auf die Ausgabe auswirkt, systemctlwenn es von einer anderen Anwendung wie z service. B. aufgerufen wird .

export SYSTEMD_PAGER=''
sudo service supervisor status

Ermöglicht es Ihnen, die gleiche Leistung zu erzielen.

Tim Kennedy
quelle
2
Ich möchte vorschlagen, die Option vor den Befehl zu stellen:sudo systemctl --no-pager status supervisor
Jeff Schaller
bearbeitet, um Ihrem Vorschlag zu entsprechen. gut zu befolgen, bestimmungsgemäße Verwendung von Werkzeugen. Vielen Dank.
Tim Kennedy
2
"Ubuntu ist ein systemdSystem" ... wenn Upstart nicht verwendet wird
cat
6
Damit sich systemctlimmer so verhält, wie --no-pageres vorgegeben ist, können Sie die SYSTEMD_PAGERUmgebungsvariable entweder auf catoder auf die leere Zeichenfolge setzen.
Jwodder
@jwodder - Das Setzen von SYSTEMD_PAGER hat den zusätzlichen Vorteil, dass es auch die Ausgabe von beeinflusst, systemctlselbst wenn es von aufgerufen wird service. Nett.
Tim Kennedy
34

less schaltet normalerweise den Pager-Modus aus, wenn festgestellt wird, dass der Ausgang kein Terminal ist. Sie können also versuchen, die Ausgabe Ihres Befehls nicht als Terminal zu definieren, indem Sie Folgendes ausführen:

sudo service supervisor status | cat
dhag
quelle
4
Diese Antwort ist gut, weil es generisch ist. Tim Kennedys Antwort ist gut, weil sie spezifisch für ist systemctl. Ich habe beide gestimmt.
Kamil Maciorowski
Ich wollte fast meine Antwort zugunsten der anderen löschen, aber ich sehe, wie wertvoll das allgemeine Wissen sein kann. Ich denke, die andere Antwort sollte die sein, die akzeptiert werden muss.
Dhag
Ich werde immer die allgemeinere Antwort wählen, alle anderen Dinge sind gleich. Dies ist genau das, was ich auf RHEL tun würde, wenn der Back-End-Befehl ausgeführt würde lessund ich dieses Verhalten nicht wollte. Wenn ich das in einem Skript machen würde, das so etwas wie die "Active:" - Zeile greift, würde es natürlich nicht zum Terminal gehen, und dieses Problem würde nicht einmal existieren.
Monty Harder
Es lessschaltet nichts aus. Es systemctlruft keinen Pager auf, wenn seine Standardausgabe kein Terminal ist.
JdeBP
@MontyHarder abgesehen von der Tatsache, dass Sie wahrscheinlich nicht die Active: -Zeile herausgreifen sollten, weil Sie nur den Exit-Code des Systemctl-Status überprüfen können (wirklich sollten Sie systemctl show in einem Skript anstelle von status verwenden) oder systemctl is- {active, failed} , das wird Ihnen ohne diese Analyse BS sagen :)
Noch ein anderer Benutzer
16

Von man systemctl:

ENVIRONMENT
...
   $SYSTEMD_PAGER
       Pager to use when --no-pager is not given; overrides $PAGER.
       Setting this to an empty string or the value "cat" is equivalent to
       passing --no-pager.

   $SYSTEMD_LESS
       Override the default options passed to less ("FRSXMK").

Also, irgendwo in Ihrer Umgebung Initialisierung, legen Sie fest:

SYSTEMD_PAGER=
muru
quelle
Nett. Das Schöne daran ist, dass die Einstellung SYSTEMD_PAGER auch andere Programme betrifft, die systemctl aufrufen! So, jetzt service supervisor statuszeigt das gleiche Verhalten.
Tim Kennedy
@Toby sorry, aber ich bevorzuge meine Manpages in Codeblöcken.
muru
3

Sie müssen auch Ihre sudoersDatei ändern :

 Defaults        env_keep += "SYSTEMD_PAGER"
JalapenoGremlin
quelle
Dies ist eine sehr nützliche Information. Es hat mich irritiert, dass nach dem Umschalten des SYSTEMD_PAGER sudo systemctl status <service>noch eine Seite angezeigt wurde. +1
Procyclinsur