[CRIU] [PATCH] service: rotate log by SIGHUP
Vladimir Davydov
vdavydov at parallels.com
Tue Feb 11 00:11:30 PST 2014
On 02/11/2014 11:49 AM, Ruslan Kuprieiev wrote:
> On 11.02.2014 11:28, Vladimir Davydov wrote:
>> On 02/11/2014 11:11 AM, Ruslan Kuprieiev wrote:
>>> Because we wan't service to work non-stop.
>>> And, as far as I know, by just using logrotate we will need to restart
>>> service.
>> Not necessarily, you can specify what should be done after rotate
>> (`postrotate'), e.g. send a signal to your service so that it could
>> reopen the logfile. However, I guess that `copytruncate' would be enough
>> in your case.
>
> But what if service will write something between the moment when
> logrotate will copy log and the moment when it will send signal to
> service?
Oh, if your logs are so valuable that loosing a message or two once a
day/week/month is a disaster, then logrotate is, of course, not an
option for you, sorry.
However, from what I see you have the same race in your implementation:
what if somebody prints to log while you're renaming it (after
log_fini(), but before log_init())? Errors will go to stderr, which
should be closed for a daemon?
>
>>> On 11.02.2014 10:59, Vladimir Davydov wrote:
>>>> Sorry for butting in, but why don't you use logrotate(8)?
>>>>
>>>> On 02/11/2014 10:41 AM, Ruslan Kuprieiev wrote:
>>>>> Many existing daemons rotate logs by SIGHUP, so lets do the same
>>>>> with our service.
>>>>>
>>>>> Signed-off-by: Ruslan Kuprieiev <kupruser at gmail.com>
>>>>> ---
>>>>> cr-service.c | 30 ++++++++++++++++++++++++++----
>>>>> 1 file changed, 26 insertions(+), 4 deletions(-)
>>>>>
>>>>> diff --git a/cr-service.c b/cr-service.c
>>>>> index 26dd3e2..49454e7 100644
>>>>> --- a/cr-service.c
>>>>> +++ b/cr-service.c
>>>>> @@ -489,12 +489,21 @@ static void reap_worker(int signo)
>>>>> }
>>>>> }
>>>>> -static int setup_sigchld_handler()
>>>>> +static void rotate_log(int signo)
>>>>> +{
>>>>> + pr_info("Rotating log.\n");
>>>>> +
>>>>> + if (log_rotate())
>>>>> + exit(1);
>>>>> +}
>>>>> +
>>>>> +static int setup_signal_handlers()
>>>>> {
>>>>> struct sigaction action;
>>>>> sigemptyset(&action.sa_mask);
>>>>> sigaddset(&action.sa_mask, SIGCHLD);
>>>>> + sigaddset(&action.sa_mask, SIGHUP);
>>>>> action.sa_handler = reap_worker;
>>>>> action.sa_flags = SA_RESTART;
>>>>> @@ -503,15 +512,23 @@ static int setup_sigchld_handler()
>>>>> return -1;
>>>>> }
>>>>> + action.sa_handler = rotate_log;
>>>>> +
>>>>> + if (sigaction(SIGHUP, &action, NULL)) {
>>>>> + pr_perror("Can't setup SIGUSR1 handler");
>>>>> + return -1;
>>>>> + }
>>>>> +
>>>>> return 0;
>>>>> }
>>>>> -static int restore_sigchld_handler()
>>>>> +static int restore_signal_handlers()
>>>>> {
>>>>> struct sigaction action;
>>>>> sigemptyset(&action.sa_mask);
>>>>> sigaddset(&action.sa_mask, SIGCHLD);
>>>>> + sigaddset(&action.sa_mask, SIGHUP);
>>>>> action.sa_handler = SIG_DFL;
>>>>> action.sa_flags = SA_RESTART;
>>>>> @@ -520,6 +537,11 @@ static int restore_sigchld_handler()
>>>>> return -1;
>>>>> }
>>>>> + if (sigaction(SIGHUP, &action, NULL)) {
>>>>> + pr_perror("Can't restore SIGHUP handler");
>>>>> + return -1;
>>>>> + }
>>>>> +
>>>>> return 0;
>>>>> }
>>>>> @@ -596,7 +618,7 @@ int cr_service(bool daemon_mode)
>>>>> }
>>>>> }
>>>>> - if (setup_sigchld_handler())
>>>>> + if (setup_signal_handlers())
>>>>> goto err;
>>>>> while (1) {
>>>>> @@ -615,7 +637,7 @@ int cr_service(bool daemon_mode)
>>>>> if (child_pid == 0) {
>>>>> int ret;
>>>>> - if (restore_sigchld_handler())
>>>>> + if (restore_signal_handlers())
>>>>> exit(1);
>>>>> close(server_fd);
>
More information about the CRIU
mailing list