Exemple #1
0
long
crm_pidfile_inuse(const char *filename, long mypid, const char *daemon)
{
    long pid = crm_read_pidfile(filename);

    if (pid < 2) {
        /* Invalid pid */
        pid = -ENOENT;
        unlink(filename);

    } else if (mypid && pid == mypid) {
        /* In use by us */
        pid = pcmk_ok;

    } else if (crm_pid_active(pid, daemon) == FALSE) {
        /* Contains a stale value */
        unlink(filename);
        pid = -ENOENT;

    } else if (mypid && pid != mypid) {
        /* locked by existing process - give up */
        pid = -EEXIST;
    }

    return pid;
}
Exemple #2
0
static gboolean
check_active_before_startup_processes(gpointer user_data)
{
    int start_seq = 1, lpc = 0;
    static int max = SIZEOF(pcmk_children);
    gboolean keep_tracking = FALSE;

    for (start_seq = 1; start_seq < max; start_seq++) {
        for (lpc = 0; lpc < max; lpc++) {
            if (pcmk_children[lpc].active_before_startup == FALSE) {
                /* we are already tracking it as a child process. */
                continue;
            } else if (start_seq != pcmk_children[lpc].start_seq) {
                continue;
            } else if (crm_pid_active(pcmk_children[lpc].pid) != 1) {
                crm_notice("Process %s terminated (pid=%d)",
                           pcmk_children[lpc].name, pcmk_children[lpc].pid);
                pcmk_process_exit(&(pcmk_children[lpc]));
                continue;
            }
            /* at least one of the processes found at startup
             * is still going, so keep this recurring timer around */
            keep_tracking = TRUE;
        }
    }

    return keep_tracking;
}
Exemple #3
0
static bool
find_and_track_existing_processes(void)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    int start_tracker = 0;

    dp = opendir("/proc");
    if (!dp) {
        /* no proc directory to search through */
        crm_notice("Can not read /proc directory to track existing components");
        return FALSE;
    }

    while ((entry = readdir(dp)) != NULL) {
        char procpath[128];
        char value[64];
        char key[16];
        FILE *file;
        int pid;
        int max = SIZEOF(pcmk_children);
        int i;

        strcpy(procpath, "/proc/");
        /* strlen("/proc/") + strlen("/status") + 1 = 14
         * 128 - 14 = 114 */
        strncat(procpath, entry->d_name, 114);

        if (lstat(procpath, &statbuf)) {
            continue;
        }
        if (!S_ISDIR(statbuf.st_mode) || !isdigit(entry->d_name[0])) {
            continue;
        }

        strcat(procpath, "/status");

        file = fopen(procpath, "r");
        if (!file) {
            continue;
        }
        if (fscanf(file, "%15s%63s", key, value) != 2) {
            fclose(file);
            continue;
        }
        fclose(file);

        pid = atoi(entry->d_name);
        if (pid <= 0) {
            continue;
        }

        for (i = 0; i < max; i++) {
            const char *name = pcmk_children[i].name;

            if (pcmk_children[i].start_seq == 0) {
                continue;
            }
            if (pcmk_children[i].flag == crm_proc_stonith_ng) {
                name = "stonithd";
            }
            if (safe_str_eq(name, value)) {
                if (crm_pid_active(pid) != 1) {
                    continue;
                }
                crm_notice("Tracking existing %s process (pid=%d)", value, pid);
                pcmk_children[i].pid = pid;
                pcmk_children[i].active_before_startup = TRUE;
                start_tracker = 1;
            }
        }
    }

    if (start_tracker) {
        g_timeout_add_seconds(PCMK_PROCESS_CHECK_INTERVAL, check_active_before_startup_processes,
                              NULL);
    }
    closedir(dp);

    return start_tracker;
}