Abaixo estão 2 exemplos idênticos de configuração de logrotate, a única diferença é o postroate
bloco onde o segundo exemplo está faltando>/dev/null 2>&1 || true
/var/log/nftables.log {
size +10M
maxage 30
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
/var/log/nftables.log {
size +10M
maxage 30
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service
endscript
}
Gostaria de saber por que o segundo exemplo é ruim (presumo que seja) e explique o que exatamente
>/dev/null 2>&1 || true
faz?
Quero dizer o significado de cada um dos personagens: >/dev/null
e 2>&1
e ||
etrue
Esta é
bash
a sintaxe básica. Você deve ler e relerman bash
qualquer tutorial ou livro do Linux Shell.Mas, aqui vai:
>/dev/null
redireciona o fluxo STDOUT para o dispositivo NULL (coletor de dados infinito), jogando-o fora.2>&1
redireciona o fluxo STDERR para STDOUT (que foi redirecionado para/dev/null
).||
é o operador lógico OR. Se (e somente se) a expressão à ESQUERDA de||
falhar (retorna diferente de zero$STATUS
), a expressão à DIREITA de||
é avaliada e retornada como o resultado de toda a expressão.true
é um programa que não faz nada exceto retornar um SUCCESS$STATUS
.Em suma,
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
significa:Execute o comando, descartando mensagens de saída e de erro. Se o comando for bem-sucedido, retorne SUCCESS. Se o comando falhar, retorne SUCESSO.
Cuidado: os
postrotate
comandos são interpretados por/bin/sh
, não/bin/bash
, portanto, quaisquer recursos estendidos do bash não funcionarão.