[CRIU] [PATCH] service: rotate log by SIGHUP
Ruslan Kuprieiev
kupruser at gmail.com
Mon Feb 10 23:49:49 PST 2014
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?
>> 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