X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/90e389f6ec12e60a62c362296ffcf314feb5b03d..5f2937099a707ddb360954f5c10fe79cfa906110:/projects/rscriptd/main.cpp?ds=inline diff --git a/projects/rscriptd/main.cpp b/projects/rscriptd/main.cpp index 714da320..7e7f7f35 100644 --- a/projects/rscriptd/main.cpp +++ b/projects/rscriptd/main.cpp @@ -36,6 +36,8 @@ #include #include #include +#include +#include // strerror #include #include "stg/common.h" @@ -193,6 +195,18 @@ newsa.sa_flags = 0; sigaction(SIGCHLD, &newsa, &oldsa); } //----------------------------------------------------------------------------- +void KillExecuters() +{ +set::iterator pid; +pid = executersPid.begin(); +while (pid != executersPid.end()) + { + printfd(__FILE__, "KillExecuters pid=%d\n", *pid); + kill(*pid, SIGUSR1); + ++pid; + } +} +//----------------------------------------------------------------------------- int StartScriptExecuter(char * procName, int msgKey, int * msgID) { STG_LOGGER & WriteServLog = GetStgLogger(); @@ -237,17 +251,55 @@ switch (executerPid) //close(1); //close(2); //setsid(); - Executer(msgKey, *msgID, executerPid, procName); + Executer(*msgID, executerPid, procName); return 1; default: // Parent if (executersPid.empty()) - Executer(msgKey, *msgID, executerPid, NULL); + Executer(*msgID, executerPid, NULL); executersPid.insert(executerPid); } return 0; } //----------------------------------------------------------------------------- +void StopScriptExecuter(int msgID) +{ +STG_LOGGER & WriteServLog = GetStgLogger(); + +for (int i = 0; i < 5; ++i) + { + struct msqid_ds data; + if (msgctl(msgID, IPC_STAT, &data)) + { + int e = errno; + printfd(__FILE__, "StopScriptExecuter() - msgctl for IPC_STAT failed: '%s'\n", strerror(e)); + WriteServLog( "Failed to check queue emptiness: '%s'", strerror(e)); + break; + } + + WriteServLog("Messages in queue: %d", data.msg_qnum); + + if (data.msg_qnum == 0) + break; + + struct timespec ts = {1, 0}; + nanosleep(&ts, NULL); + } + +if (msgctl(msgID, IPC_RMID, NULL)) + { + int e = errno; + printfd(__FILE__, "StopScriptExecuter() - msgctl for IPC_STAT failed: '%s'\n", strerror(e)); + WriteServLog("Failed to remove queue: '%s'", strerror(e)); + } +else + { + WriteServLog("Queue removed successfully."); + } + +KillExecuters(); +} +//----------------------------------------------------------------------------- #ifdef NO_DAEMON int ForkAndWait(const string &) #else @@ -256,8 +308,6 @@ int ForkAndWait(const string & confDir) { #ifndef NO_DAEMON stgChildPid = fork(); -string startFile = confDir + START_FILE; -unlink(startFile.c_str()); switch (stgChildPid) { @@ -273,23 +323,6 @@ switch (stgChildPid) break; default: // Parent - for (int i = 0; i < 120 * 5; i++) - { - if (access(startFile.c_str(), F_OK) == 0) - { - //printf("Fork successfull. Exit.\n"); - unlink(startFile.c_str()); - exit(0); - } - - if (childExited) - { - unlink(startFile.c_str()); - exit(1); - } - usleep(200000); - } - unlink(startFile.c_str()); exit(1); break; } @@ -297,18 +330,6 @@ switch (stgChildPid) return 0; } //----------------------------------------------------------------------------- -void KillExecuters() -{ -set::iterator pid; -pid = executersPid.begin(); -while (pid != executersPid.end()) - { - printfd(__FILE__, "KillExecuters pid=%d\n", *pid); - kill(*pid, SIGUSR1); - ++pid; - } -} -//----------------------------------------------------------------------------- int main(int argc, char * argv[]) { @@ -407,11 +428,6 @@ listener->Start(); WriteServLog("rscriptd started successfully."); WriteServLog("+++++++++++++++++++++++++++++++++++++++++++++"); -#ifndef NO_DAEMON -string startFile(confDir + START_FILE); -creat(startFile.c_str(), S_IRUSR); -#endif - while (nonstop.GetStatus()) { usleep(100000); @@ -421,13 +437,7 @@ listener->Stop(); WriteServLog("+++++++++++++++++++++++++++++++++++++++++++++"); -int res = msgctl(msgID, IPC_RMID, NULL); -if (res) - WriteServLog("Queue was not removed. id=%d", msgID); -else - WriteServLog("Queue removed successfully."); - -KillExecuters(); +StopScriptExecuter(msgID); WriteServLog("rscriptd stopped successfully."); WriteServLog("---------------------------------------------");