Como o logrotate trata o globbing?

5

Se eu tiver um arquivo de configuração logrotate como este,

# matches multiple ones
/var/log/project/*.log {
   ...

   prerotate
      ...
   endscript

   ...
} 

Então, como funciona o glob aqui? Se eu tiver 3 arquivos de log que correspondam a esse padrão, o script prerotate será executado por 3 vezes ou apenas uma vez? Não encontrei nenhuma pista em logrotate (8)

    
por daisy 14.03.2013 / 02:45

2 respostas

4

É executado três vezes, uma vez para cada arquivo correspondente. Há uma dica na página man:

sharedscripts
       Normally,  prerotate  and postrotate scripts are run for each log which is rotated and the absolute path
       to the log file is passed as first argument to the script. That means a single script may be run  multi-
       ple  times  for  log  file  entries which match multiple files (such as the /var/log/news/* example). If
       sharedscripts is specified, the scripts are only run once, no matter how many logs match the  wildcarded
       pattern,  and  whole  pattern  is  passed  to them.  However, if none of the logs in the pattern require
       rotating, the scripts will not be run at all. If the scripts exit with error, the remaining actions will
       not  be  executed  for  any  logs.  This  option overrides the nosharedscripts option and implies create
       option.

Mas é claro, você só descobre que, uma vez que você saiba, olha lá. (Além disso, verifiquei experimentalmente com logrotate -v ;))

    
por 15.03.2013 / 07:59
6

Por que vale a pena, logrotate usa glob.h (veja: man 3 glob ), que está documentado muito bem em man 7 glob . É semelhante em muitos aspectos a bash globbing (sem globbing estendido), mas não é idêntico. Em particular, isso significa que ele suporta:

?      match a single character
*      match any string, including the empty string
[...]  match any of the listed characters
[a-z]  match a range of characters
[!...] match any but the listed characters
[:xx:] match various character classes, like [:digit:], [:blank:], etc.

A globalização é aplicada a cada componente do caminho separadamente. Por exemplo, se eu tiver um servidor rsyslog coletando logs de vários hosts, posso usar uma estrofe logrotate como:

/var/log/host/*/*/syslog {
    rotate 5
    ...
}
    
por 21.07.2013 / 20:53