Могу ли я предотвратить, чтобы «service foo status» передавал свои выходные данные через «less»?

35

Как остановить команду service <name> statusот использования lessна его выходе?

У меня есть скрипт, который автоматизирует некоторые действия sysadmin, и после того, как я обновил свой сервер до Ubuntu 16.04, он ломается, потому что блокируют действия, которые проверяют состояние сервиса, потому что он использует что-то вроде lessотображения вывода, в частности, supervisorсервиса.

У меня есть несколько демонов, настроенных для запуска, и при запуске sudo service supervisor statusя получаю:

* 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

И он не вернется, пока я не прокручу вручную или не нажму Qдля выхода. Как отключить эту функцию?

Cerin
источник

Ответы:

54

Ubuntu - это система systemd, где на service statusсамом деле вызывается команда systemctl status, а в systemctl есть --no-pagerопция, которая делает именно то, что вы ищете. Так что вам может быть лучше использовать прямую команду systemctl в вашем скрипте.

sudo systemctl --no-pager status supervisor

РЕДАКТИРОВАТЬ: env var SYSTEMD_PAGER

Другим способом, указанным @jwodder, является установка переменной среды SYSTEMD_PAGER. Это имеет дополнительное преимущество, так как влияет на вывод systemctlпри вызове другого приложения, например service.

export SYSTEMD_PAGER=''
sudo service supervisor status

Позволит вам добиться того же результата.

Тим Кеннеди
источник
2
Я хотел бы предложить поставить вариант перед командой:sudo systemctl --no-pager status supervisor
Джефф Шаллер
отредактировано, чтобы соответствовать вашему предложению. хорошо следовать предполагаемому использованию инструментов. Спасибо.
Тим Кеннеди
2
«Ubuntu - это systemdсистема» ... когда Upstart не используется, то есть
cat
6
Чтобы systemctlвсегда вести себя так, как --no-pagerзадано, вы можете установить для SYSTEMD_PAGERпеременной среды либо catпустую строку, либо.
jwodder
@jwodder - настройка SYSTEMD_PAGER имеет дополнительное преимущество, так как также влияет на вывод systemctlдаже при вызове service. Ницца.
Тим Кеннеди
34

less обычно отключает режим пейджера, если обнаруживает, что его выход не является терминалом. Таким образом, вы можете попробовать сделать вывод вашей команды не-терминал, выполнив что-то вроде:

sudo service supervisor status | cat
dhag
источник
4
Этот ответ хорош, потому что он общий. Ответ Тима Кеннеди хорош, потому что он специфичен для systemctl. Я проголосовал за оба.
Камиль Мачоровски
Я почти собирался удалить свой ответ в пользу другого, но я вижу, как полезен общий кусочек знаний. Для протокола, я думаю, что другой ответ должен быть тем, который будет принят.
дхаг
Я всегда буду выбирать более общий ответ, при прочих равных условиях. Это именно то, что я сделал бы на RHEL, если бы команда back-end собиралась, lessи я не хотел такого поведения. Конечно, если бы я делал это в сценарии, который выдает что-то вроде строки «Active:», он уже не собирался идти к терминалу, и эта проблема даже не существовала бы.
Монти Хардер
Это ничего не lessвыключает. Во systemctl-первых, он не вызывает пейджер, когда его стандартный вывод не является терминалом.
JdeBP
@MontyHarder, кроме того факта, что вам, вероятно, не следует отключать строку Active: потому что вы можете просто проверить код завершения статуса systemctl (на самом деле вы должны использовать systemctl show в скрипте вместо status) или systemctl is- {active, failed} , который расскажет вам об этом без всякой
еще один пользователь
16

От 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").

Итак, где-то в вашей среде инициализации, установите:

SYSTEMD_PAGER=
Мур
источник
Ницца. Это хорошо, что настройка SYSTEMD_PAGER также влияет на другие программы, которые вызывают systemctl! так что теперь, service supervisor statusдемонстрирует такое же поведение.
Тим Кеннеди
@ Извините, но я предпочитаю свои страницы в блоках кода.
Муру
3

Вам также нужно будет изменить ваш sudoersфайл:

 Defaults        env_keep += "SYSTEMD_PAGER"
JalapenoGremlin
источник
Это очень полезная информация. Меня раздражало то, что после переключения SYSTEMD_PAGER sudo systemctl status <service>все еще выполнялась постраничная передача . +1
Procyclinsur