Desativa o buffer no arquivo de unidade do systemd?

1

Quando escrevo meu arquivo de unidade, quero que todas as saídas de Exec* -options ( ExecStartPre=, ExecStartPost=, ExecStart=, and ExecStopPost= ) sejam enviadas para o diário. Mas, aparentemente, a saída é armazenada em buffer de alguma forma, de modo algum é certo o que será escrito para o periódico.

No meu arquivo de unidade ( ulftest.service ), tenho a seguinte seção:

...
ExecStartPre=/bin/echo 'Hello'
ExecStartPre=/usr/bin/who
ExecStart=/storage/_test/venv/bin/python /storage/_test/ulftestservice.py
...

Então, eu esperaria que houvesse uma lista de usuários logados (4 de mim) e um Olá aparecendo no diário, além das linhas normais Iniciando, Iniciado, Parando e Parado.

Isso NÃO é o caso. É totalmente (para mim, pelo menos) aleatório se eles aparecerem ou não.

Eu escrevi um pequeno testloop que reinicia o serviço a cada 2 segundos:

$ for x in 'seq 100'; do echo $x; sudo systemctl restart ulftest.service ; sleep 2; done

Depois de executar a coisa eu recebo isso no diário:

...
2017-05-10T09:40:36+0000 ulf44 systemd[1]: Started UlfTest, Administrative interface.
2017-05-10T09:40:38+0000 ulf44 systemd[1]: Stopping UlfTest, Administrative interface...
2017-05-10T09:40:38+0000 ulf44 systemd[1]: Stopped UlfTest, Administrative interface.
2017-05-10T09:40:38+0000 ulf44 systemd[1]: Starting UlfTest, Administrative interface...
2017-05-10T09:40:38+0000 ulf44 who[27344]: ulf      pts/0        2017-05-04 09:07 (192.168.0.180)
2017-05-10T09:40:38+0000 ulf44 who[27344]: ulf      pts/1        2017-05-04 12:36 (192.168.0.180)
2017-05-10T09:40:38+0000 ulf44 who[27344]: ulf      pts/2        2017-05-05 06:48 (192.168.0.180)
2017-05-10T09:40:38+0000 ulf44 systemd[1]: Started UlfTest, Administrative interface.
2017-05-10T09:40:40+0000 ulf44 systemd[1]: Stopping UlfTest, Administrative interface...
2017-05-10T09:40:40+0000 ulf44 systemd[1]: Stopped UlfTest, Administrative interface.
2017-05-10T09:40:40+0000 ulf44 systemd[1]: Starting UlfTest, Administrative interface...
2017-05-10T09:40:40+0000 ulf44 systemd[1]: Started UlfTest, Administrative interface.
...
2017-05-10T09:42:00+0000 ulf44 systemd[1]: Stopping UlfTest, Administrative interface...
2017-05-10T09:42:00+0000 ulf44 systemd[1]: Stopped UlfTest, Administrative interface.
2017-05-10T09:42:00+0000 ulf44 systemd[1]: Starting UlfTest, Administrative interface...
2017-05-10T09:42:00+0000 ulf44 who[28161]: ulf      pts/0        2017-05-04 09:07 (192.168.0.180)
2017-05-10T09:42:00+0000 ulf44 who[28161]: ulf      pts/1        2017-05-04 12:36 (192.168.0.180)
2017-05-10T09:42:00+0000 ulf44 who[28161]: ulf      pts/2        2017-05-05 06:48 (192.168.0.180)
2017-05-10T09:42:00+0000 ulf44 who[28161]: ulf      pts/3        2017-05-05 11:44 (192.168.0.180)
2017-05-10T09:42:00+0000 ulf44 systemd[1]: Started UlfTest, Administrative interface.
2017-05-10T09:42:02+0000 ulf44 systemd[1]: Stopping UlfTest, Administrative interface...
2017-05-10T09:42:02+0000 ulf44 systemd[1]: Stopped UlfTest, Administrative interface.
2017-05-10T09:42:02+0000 ulf44 systemd[1]: Starting UlfTest, Administrative interface...
2017-05-10T09:42:02+0000 ulf44 systemd[1]: Started UlfTest, Administrative interface.
...

Observe que, para as 100 reinicializações, não obtenho nenhuma saída na maioria das vezes não recebo Hello , mas recebo 2 rodadas de saída de who , mas com apenas uma delas completa. / p>

Estou em um novo Ubuntu 16.04. Também fiz uma pergunta semelhante e relacionada em stackoverflow .

Isso é um recurso, um bug ou apenas algo que eu estou abordando de forma totalmente errada? Por favor me avise!

    
por UlfR 10.05.2017 / 12:00

2 respostas

0

man systemd.exec

Eu acho que você precisa tentar usar na sua unidade StandardOutput=journal

 journal connects standard output with the journal which is accessible via journalctl(1). Note that everything that is written to syslog or kmsg (see below) is
           implicitly stored in the journal as well, the specific two options listed below are hence supersets of this one.
    
por 10.05.2017 / 14:37
0

Além de liberar o stdin, você pode usar o comando unbuffer do expect package.i

Seu arquivo de unidade será parecido com isto:

... [Service] ExecStart=/usr/bin/unbuffer /path/to/your/scripts.py ...

Outra opção que pode lhe dar um pouco mais de controle é usar stdbuf , que chama setvbuf() , mas isso só funciona se o processo que você executa não chamar setvbuf () para anular as alterações.

    
por 24.01.2018 / 08:20