From d9eeefc2373e9b6f0dcf8dff6618ca9361044419 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Fri, 28 May 2021 15:56:00 -0400 Subject: [PATCH] 2021-05-28 Fred Gleason * Added syslog DEBUG messages around the start/stop of ephemeral processes in rdservice(8). * Added an '--initial-maintenance' switch to rdservice(8). Signed-off-by: Fred Gleason --- ChangeLog | 4 ++++ docs/manpages/rdservice.xml | 14 ++++++++++++- rdservice/maint_routines.cpp | 17 +++++++++++++--- rdservice/rdservice.cpp | 39 +++++++++++++++++++++++++++++++++++- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a5181365..dc6b466c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21724,3 +21724,7 @@ 2021-05-28 Fred Gleason * Fixed a use-after-delete bug in rdimport(1) that could cause a segfault when the '--fix-broken-formats' switch was given. +2021-05-28 Fred Gleason + * Added syslog DEBUG messages around the start/stop of ephemeral + processes in rdservice(8). + * Added an '--initial-maintenance' switch to rdservice(8). diff --git a/docs/manpages/rdservice.xml b/docs/manpages/rdservice.xml index 0f81534c..1fe2e45d 100644 --- a/docs/manpages/rdservice.xml +++ b/docs/manpages/rdservice.xml @@ -89,8 +89,20 @@ + + + + + + + + Schedule the initial maintenance run to be started + interval milliseconds after startup. + + + - + Exit Values diff --git a/rdservice/maint_routines.cpp b/rdservice/maint_routines.cpp index c026af1a..fa4cbc74 100644 --- a/rdservice/maint_routines.cpp +++ b/rdservice/maint_routines.cpp @@ -2,7 +2,7 @@ // // Rivendell Maintenance Routines // -// (C) Copyright 2008-2020 Fred Gleason +// (C) Copyright 2008-2021 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -23,12 +23,15 @@ #include #include +#include #include #include "rdservice.h" void MainObject::checkMaintData() { + rda->syslog(LOG_DEBUG,"starting maintenance checks"); + QString sql; RDSqlQuery *q; QDateTime current_datetime= @@ -38,7 +41,12 @@ void MainObject::checkMaintData() // // Schedule Next Maintenance Run // - svc_maint_timer->start(GetMaintInterval()); + int interval=GetMaintInterval(); + svc_maint_timer->start(interval); + rda->syslog(LOG_DEBUG,"next maintenance run at %s [%s from now]", + QDateTime::currentDateTime().addMSecs(interval). + toString("hh:mm:ss").toUtf8().constData(), + RDGetTimeLength(interval,false,false).toUtf8().constData()); RunLocalMaintRoutine(); @@ -107,12 +115,15 @@ int MainObject::GetMaintInterval() const void MainObject::RunEphemeralProcess(int id,const QString &program, const QStringList &args) { + rda->syslog(LOG_DEBUG,"starting ephemeral process \"%s\"", + (program+" "+args.join(" ")).trimmed().toUtf8().constData()); svc_processes[id]=new RDProcess(id,this); connect(svc_processes[id],SIGNAL(finished(int)), this,SLOT(processFinishedData(int))); svc_processes[id]->start(program,args); if(!svc_processes[id]->process()->waitForStarted()) { - QString err_msg=tr("unable to start")+"\""+program+"\": "+ + QString err_msg=tr("unable to start ephemeral process ")+ + "\""+(program+" "+args.join(" ")).trimmed()+"\": "+ svc_processes[id]->errorText(); rda->syslog(LOG_WARNING,"%s",(const char *)err_msg.toUtf8()); delete svc_processes[id]; diff --git a/rdservice/rdservice.cpp b/rdservice/rdservice.cpp index 8a729b2c..9365cbd6 100644 --- a/rdservice/rdservice.cpp +++ b/rdservice/rdservice.cpp @@ -57,6 +57,8 @@ MainObject::MainObject(QObject *parent) { QString err_msg; RDApplication::ErrorType err_type=RDApplication::ErrorOk; + int initial_maintenance_interval=-1; + bool ok=false; svc_startup_target=MainObject::TargetAll; @@ -77,6 +79,7 @@ MainObject::MainObject(QObject *parent) err_msg.toUtf8().constData()); exit(RDApplication::ExitNoDb); } + rda->syslog(LOG_DEBUG,"starting up"); // // Process Startup Options @@ -88,6 +91,15 @@ MainObject::MainObject(QObject *parent) svc_startup_target=target; rda->cmdSwitch()->setProcessed(i,true); } + if(rda->cmdSwitch()->key(i)=="--initial-maintenance-interval") { + initial_maintenance_interval=rda->cmdSwitch()->value(i).toInt(&ok); + if(!ok) { + fprintf(stderr, + "rdservice: invalid \"--initial-maintenance-interval\" value\n"); + exit(4); + } + rda->cmdSwitch()->setProcessed(i,true); + } } if(!rda->cmdSwitch()->processed(i)) { fprintf(stderr,"rdservice: unknown command-line option\n"); @@ -121,6 +133,13 @@ MainObject::MainObject(QObject *parent) connect(svc_maint_timer,SIGNAL(timeout()),this,SLOT(checkMaintData())); int interval=GetMaintInterval(); if(!rda->config()->disableMaintChecks()) { + if(initial_maintenance_interval>=0) { + interval=initial_maintenance_interval; + } + rda->syslog(LOG_DEBUG,"initial maintenance run at %s [%s from now]", + QDateTime::currentDateTime().addMSecs(interval). + toString("hh:mm:ss").toUtf8().constData(), + RDGetTimeLength(interval,false,false).toUtf8().constData()); svc_maint_timer->start(interval); } else { @@ -136,7 +155,25 @@ MainObject::MainObject(QObject *parent) void MainObject::processFinishedData(int id) { - svc_processes[id]->deleteLater(); + RDProcess *proc=svc_processes.value(id); + if(proc->process()->exitStatus()!=QProcess::NormalExit) { + rda->syslog(LOG_WARNING,"process \"%s\" crashed!", + (proc->program()+" "+proc->arguments().join(" ").trimmed()). + toUtf8().constData()); + } + else { + if(proc->process()->exitCode()!=0) { + rda->syslog(LOG_WARNING,"process \"%s\" exited with exit code %d", + (proc->program()+" "+proc->arguments().join(" ").trimmed()). + toUtf8().constData(), + proc->process()->exitCode()); + } + else { + rda->syslog(LOG_DEBUG,"process \"%s\" exited normally", + (proc->program()+" "+proc->arguments().join(" ").trimmed()). + toUtf8().constData()); + } + } svc_processes.remove(id); }