Posso impedir que o "status do serviço foo" pagine sua saída através de "menos"?


35

Como você para o comando service <name> statusde usar lessem sua saída?

Eu tenho um script que automatiza algumas ações do sysadmin e, depois que atualizei meu servidor para o Ubuntu 16.04, ele será interrompido porque as ações que verificam o status do serviço estão bloqueando porque estão usando algo como lesspara mostrar a saída, especificamente o supervisorserviço.

Eu tenho vários daemons configurados para serem executados e, quando executados sudo service supervisor status, recebo:

* 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

E ele não retorna até que eu role manualmente para baixo ou pressione Qpara sair. Como desativo esse recurso?

Respostas:


54

O Ubuntu é um sistema systemd, onde o service statuscomando realmente chama systemctl status, e o systemctl tem uma --no-pageropção que faz exatamente o que você está procurando. Então você pode estar melhor usando o comando systemctl direto no seu script.

sudo systemctl --no-pager status supervisor

EDIT: env var SYSTEMD_PAGER

Outra maneira, como apontado por @jwodder, é definir a variável de ambiente SYSTEMD_PAGER. Isso tem o benefício adicional de afetar também a saída de systemctlquando chamado por outro aplicativo como service.

export SYSTEMD_PAGER=''
sudo service supervisor status

Permitirá que você obtenha a mesma saída.


2
Eu gostaria de sugerir colocar a opção antes do comando:sudo systemctl --no-pager status supervisor
Jeff Schaller

editado para corresponder à sua sugestão. bom seguir o uso pretendido das ferramentas. obrigado.
Tim Kennedy

2
"Ubuntu é um systemdsistema" ... quando o Upstart não está em uso, isto é
cat

6
Para fazer com que systemctlsempre se comporte como --no-pageré fornecido, é possível definir a SYSTEMD_PAGERvariável de ambiente como uma catou a sequência vazia.
jwodder

@jwodder - definir SYSTEMD_PAGER tem a vantagem adicional de afetar também a saída systemctlmesmo quando chamado service. Agradável.
Tim Kennedy

34

less normalmente desligará o modo pager se detectar que sua saída não é um terminal. Portanto, você pode tentar tornar a saída do comando não um terminal executando algo como:

sudo service supervisor status | cat

4
Essa resposta é boa porque é genérica. A resposta de Tim Kennedy é boa porque é específica systemctl. Eu votei em ambos.
Kamil Maciorowski

Eu estava quase prestes a excluir minha resposta em favor da outra, mas vejo como o boato genérico do conhecimento pode ser valioso. Para o registro, acho que a outra resposta deve ser a única a ser aceita.
58417 dhag

Eu sempre escolherei a resposta mais genérica, todas as outras coisas sendo iguais. Isso é exatamente o que eu faria no RHEL se o comando de back-end fosse lesse eu não quisesse esse comportamento. Obviamente, se eu estivesse fazendo isso em um script que cumprisse algo como a linha "Active:", ela já não estaria terminando e esse problema nem existiria.
Monty mais duros

Não está lessdesligando nada. Não está systemctlchamando um pager em primeiro lugar quando sua saída padrão não é um terminal.
JdeBP

@MontyHarder além do fato de que você provavelmente não deve exibir a linha Active: porque você pode apenas verificar o código de saída do status systemctl (realmente você deve usar systemctl show em um script em vez de status) ou systemctl está- {ativo, com falha} , que informará você sem analisar nada BS :)
Outro usuário

16

De 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").

Portanto, em algum lugar da inicialização do seu ambiente, defina:

SYSTEMD_PAGER=

Agradável. O bom disso é que a configuração SYSTEMD_PAGER também afeta outros programas que chamam systemctl! agora, service supervisor statusexibe o mesmo comportamento.
Tim Kennedy

@ Desculpe, mas eu prefiro minhas páginas de manual em blocos de código.
muru

3

Você também precisará modificar seu sudoersarquivo:

 Defaults        env_keep += "SYSTEMD_PAGER"

Esta é uma informação muito útil .. estava ficando irritado com o fato de que depois de trocar a SYSTEMD_PAGER, sudo systemctl status <service>ainda estava paginado .. +1
Procyclinsur
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.