void uwsgi_daemons_spawn_all() { struct uwsgi_daemon *ud = uwsgi.daemons; while (ud) { if (!ud->registered) { #ifdef UWSGI_SSL if (ud->legion && !uwsgi_legion_i_am_the_lord(ud->legion)) { // part of legion, register but don't spawn it yet if (ud->pidfile) { ud->pid = uwsgi_check_pidfile(ud->pidfile); if (ud->pid > 0) uwsgi_log("[uwsgi-daemons] found valid/active pidfile for \"%s\" (pid: %d)\n", ud->command, (int) ud->pid); } ud->registered = 1; ud = ud->next; continue; } #endif ud->registered = 1; if (ud->pidfile) { int checked_pid = uwsgi_check_pidfile(ud->pidfile); if (checked_pid <= 0) { uwsgi_spawn_daemon(ud); } else { ud->pid = checked_pid; uwsgi_log("[uwsgi-daemons] found valid/active pidfile for \"%s\" (pid: %d)\n", ud->command, (int) ud->pid); } } else { uwsgi_spawn_daemon(ud); } } ud = ud->next; } }
// this function is called when a dumb daemon dies and we want to respawn it int uwsgi_daemon_check_pid_reload(pid_t diedpid) { struct uwsgi_daemon *ud = uwsgi.daemons; while (ud) { if (ud->pid == diedpid && !ud->pidfile) { uwsgi_spawn_daemon(ud); return 1; } ud = ud->next; } return 0; }
void uwsgi_daemons_smart_check() { static time_t last_run = 0; time_t now = uwsgi_now(); if (now - last_run <= 0) { return; } last_run = now; struct uwsgi_daemon *ud = uwsgi.daemons; while (ud) { if (ud->pidfile) { int checked_pid = uwsgi_check_pidfile(ud->pidfile); if (checked_pid <= 0) { // monitored instance if (ud->status == 2) { uwsgi_spawn_daemon(ud); } else { ud->pidfile_checks++; if (ud->pidfile_checks >= (unsigned int) ud->freq) { uwsgi_log("[uwsgi-daemons] found changed pidfile for \"%s\" (old_pid: %d new_pid: %d)\n", ud->command, (int) ud->pid, (int) checked_pid); uwsgi_spawn_daemon(ud); } } } else if (checked_pid != ud->pid) { uwsgi_log("[uwsgi-daemons] found changed pid for \"%s\" (old_pid: %d new_pid: %d)\n", ud->command, (int) ud->pid, (int) checked_pid); ud->pid = checked_pid; } // all ok, pidfile and process found else { ud->status = 2; } } ud = ud->next; } }
void uwsgi_daemons_spawn_all() { struct uwsgi_daemon *ud = uwsgi.daemons; while (ud) { if (!ud->registered) { if (ud->pidfile) { int checked_pid = uwsgi_check_pidfile(ud->pidfile); if (checked_pid <= 0) { uwsgi_spawn_daemon(ud); } else { ud->pid = checked_pid; uwsgi_log("[uwsgi-daemons] found valid/active pidfile for \"%s\" (pid: %d)\n", ud->command, (int) ud->pid); } } else { uwsgi_spawn_daemon(ud); } ud->registered = 1; } ud = ud->next; } }
// this function is called when a dumb daemon dies and we want to respawn it int uwsgi_daemon_check_pid_reload(pid_t diedpid) { struct uwsgi_daemon *ud = uwsgi.daemons; while (ud) { #ifdef UWSGI_SSL if (ud->pid == diedpid && ud->legion && !uwsgi_legion_i_am_the_lord(ud->legion)) { // part of legion but not lord, don't respawn ud->pid = -1; uwsgi_log("uwsgi-daemons] legion \"%s\" daemon \"%s\" (pid: %d) annihilated\n", ud->legion, ud->command, (int) diedpid); ud = ud->next; continue; } #endif if (ud->pid == diedpid && !ud->pidfile) { if (ud->control) { gracefully_kill_them_all(0); return 0; } uwsgi_spawn_daemon(ud); return 1; } ud = ud->next; } return 0; }
void uwsgi_daemons_smart_check() { static time_t last_run = 0; time_t now = uwsgi_now(); if (now - last_run <= 0) { return; } last_run = now; struct uwsgi_daemon *ud = uwsgi.daemons; while (ud) { #ifdef UWSGI_SSL if (ud->legion) { if (uwsgi_legion_i_am_the_lord(ud->legion)) { // lord, spawn if not running if (ud->pid <= 0) { uwsgi_spawn_daemon(ud); } } else { // not lord, kill daemon if running if (ud->pid > 0) { if (!kill(ud->pid, 0)) { uwsgi_log("[uwsgi_daemons] stopping legion \"%s\" daemon: %s (pid: %d)\n", ud->legion, ud->command, ud->pid); kill(-ud->pid, ud->stop_signal); } else { // pid already died ud->pid = -1; } } ud = ud->next; continue; } } #endif if (ud->pidfile) { int checked_pid = uwsgi_check_pidfile(ud->pidfile); if (checked_pid <= 0) { // monitored instance if (ud->status == 2) { uwsgi_spawn_daemon(ud); } else { ud->pidfile_checks++; if (ud->pidfile_checks >= (unsigned int) ud->freq) { if (!ud->has_daemonized) { uwsgi_log_verbose("[uwsgi-daemons] \"%s\" (pid: %d) did not daemonize !!!\n", ud->command, (int) ud->pid); ud->pidfile_checks = 0; } else { uwsgi_log("[uwsgi-daemons] found changed pidfile for \"%s\" (old_pid: %d new_pid: %d)\n", ud->command, (int) ud->pid, (int) checked_pid); uwsgi_spawn_daemon(ud); } } } } else if (checked_pid != ud->pid) { uwsgi_log("[uwsgi-daemons] found changed pid for \"%s\" (old_pid: %d new_pid: %d)\n", ud->command, (int) ud->pid, (int) checked_pid); ud->pid = checked_pid; } // all ok, pidfile and process found else { ud->status = 2; } } ud = ud->next; } }