diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rc/start-stop-daemon.c | 29 | ||||
-rw-r--r-- | src/rc/supervise-daemon.c | 30 |
2 files changed, 53 insertions, 6 deletions
diff --git a/src/rc/start-stop-daemon.c b/src/rc/start-stop-daemon.c index e6febe82..62e579d1 100644 --- a/src/rc/start-stop-daemon.c +++ b/src/rc/start-stop-daemon.c @@ -72,6 +72,7 @@ const struct option longopts[] = { { "ionice", 1, NULL, 'I'}, { "stop", 0, NULL, 'K'}, { "nicelevel", 1, NULL, 'N'}, + { "oom-score-adj",1, NULL,0x80}, { "retry", 1, NULL, 'R'}, { "start", 0, NULL, 'S'}, { "startas", 1, NULL, 'a'}, @@ -103,6 +104,7 @@ const char * const longopts_help[] = { "Set an ionice class:data when starting", "Stop daemon", "Set a nicelevel when starting", + "Set OOM score adjustment when starting", "Retry schedule to use when stopping", "Start daemon", "deprecated, use --exec or --name", @@ -270,7 +272,8 @@ int main(int argc, char **argv) char *pidfile = NULL; char *retry = NULL; int sig = -1; - int nicelevel = 0, ionicec = -1, ioniced = 0; + int nicelevel = INT_MIN, ionicec = -1, ioniced = 0; + int oom_score_adj = INT_MIN; bool background = false; bool makepidfile = false; bool interpreted = false; @@ -327,6 +330,10 @@ int main(int argc, char **argv) ioniced = 7; ionicec <<= 13; /* class shift */ } + if ((tmp = getenv("SSD_OOM_SCORE_ADJ"))) + if (sscanf(tmp, "%d", &oom_score_adj) != 1) + eerror("%s: invalid oom_score_adj `%s' (SSD_OOM_SCORE_ADJ)", + applet, tmp); /* Get our user name and initial dir */ p = getenv("USER"); @@ -367,6 +374,12 @@ int main(int argc, char **argv) applet, optarg); break; + case 0x80: /* --oom-score-adj */ + if (sscanf(optarg, "%d", &oom_score_adj) != 1) + eerrorx("%s: invalid oom-score-adj `%s'", + applet, optarg); + break; + case 'P': /* --progress */ progress = true; break; @@ -778,7 +791,7 @@ int main(int argc, char **argv) devnull_fd = open("/dev/null", O_RDWR); - if (nicelevel) { + if (nicelevel != INT_MIN) { if (setpriority(PRIO_PROCESS, mypid, nicelevel) == -1) eerrorx("%s: setpriority %d: %s", applet, nicelevel, @@ -790,6 +803,15 @@ int main(int argc, char **argv) eerrorx("%s: ioprio_set %d %d: %s", applet, ionicec, ioniced, strerror(errno)); + if (oom_score_adj != INT_MIN) { + fp = fopen("/proc/self/oom_score_adj", "w"); + if (!fp) + eerrorx("%s: oom_score_adj %d: %s", applet, + oom_score_adj, strerror(errno)); + fprintf(fp, "%d\n", oom_score_adj); + fclose(fp); + } + if (ch_root && chroot(ch_root) < 0) eerrorx("%s: chroot `%s': %s", applet, ch_root, strerror(errno)); @@ -867,7 +889,8 @@ int main(int argc, char **argv) strncmp(env->value, "RC_SERVICE=", 11) != 0 && strncmp(env->value, "RC_SVCNAME=", 11) != 0) || strncmp(env->value, "SSD_NICELEVEL=", 14) == 0 || - strncmp(env->value, "SSD_IONICELEVEL=", 16) == 0) + strncmp(env->value, "SSD_IONICELEVEL=", 16) == 0 || + strncmp(env->value, "SSD_OOM_SCORE_ADJ=", 18) == 0) { p = strchr(env->value, '='); *p = '\0'; diff --git a/src/rc/supervise-daemon.c b/src/rc/supervise-daemon.c index 49b09c04..ddadb677 100644 --- a/src/rc/supervise-daemon.c +++ b/src/rc/supervise-daemon.c @@ -82,6 +82,7 @@ const struct option longopts[] = { { "umask", 1, NULL, 'k'}, { "respawn-max", 1, NULL, 'm'}, { "nicelevel", 1, NULL, 'N'}, + { "oom-score-adj",1, NULL,0x80}, { "pidfile", 1, NULL, 'p'}, { "respawn-period", 1, NULL, 'P'}, { "retry", 1, NULL, 'R'}, @@ -106,6 +107,7 @@ const char * const longopts_help[] = { "Set the umask for the daemon", "set maximum number of respawn attempts", "Set a nicelevel when starting", + "Set OOM score adjustment when starting", "Match pid found in this file", "Set respawn time period", "Retry schedule to use when stopping", @@ -124,9 +126,10 @@ static int healthcheckdelay = 0; static int healthchecktimer = 0; static volatile sig_atomic_t do_healthcheck = 0; static volatile sig_atomic_t exiting = 0; -static int nicelevel = 0; +static int nicelevel = INT_MIN; static int ionicec = -1; static int ioniced = 0; +static int oom_score_adj = INT_MIN; static char *changeuser, *ch_root, *ch_dir; static uid_t uid = 0; static gid_t gid = 0; @@ -332,6 +335,7 @@ static void child_process(char *exec, char **argv) time_t start_time; char start_count_string[20]; char start_time_string[20]; + FILE *fp; #ifdef HAVE_PAM pam_handle_t *pamh = NULL; @@ -351,7 +355,7 @@ static void child_process(char *exec, char **argv) rc_service_value_set(svcname, "child_pid", start_count_string); } - if (nicelevel) { + if (nicelevel != INT_MIN) { if (setpriority(PRIO_PROCESS, getpid(), nicelevel) == -1) eerrorx("%s: setpriority %d: %s", applet, nicelevel, strerror(errno)); @@ -361,6 +365,15 @@ static void child_process(char *exec, char **argv) eerrorx("%s: ioprio_set %d %d: %s", applet, ionicec, ioniced, strerror(errno)); + if (oom_score_adj != INT_MIN) { + fp = fopen("/proc/self/oom_score_adj", "w"); + if (!fp) + eerrorx("%s: oom_score_adj %d: %s", applet, + oom_score_adj, strerror(errno)); + fprintf(fp, "%d\n", oom_score_adj); + fclose(fp); + } + if (ch_root && chroot(ch_root) < 0) eerrorx("%s: chroot `%s': %s", applet, ch_root, strerror(errno)); @@ -424,7 +437,8 @@ static void child_process(char *exec, char **argv) strncmp(env->value, "RC_SERVICE=", 11) != 0 && strncmp(env->value, "RC_SVCNAME=", 11) != 0) || strncmp(env->value, "SSD_NICELEVEL=", 14) == 0 || - strncmp(env->value, "SSD_IONICELEVEL=", 16) == 0) + strncmp(env->value, "SSD_IONICELEVEL=", 16) == 0 || + strncmp(env->value, "SSD_OOM_SCORE_ADJ=", 18) == 0) { p = strchr(env->value, '='); *p = '\0'; @@ -745,6 +759,10 @@ int main(int argc, char **argv) ioniced = 7; ionicec <<= 13; /* class shift */ } + if ((tmp = getenv("SSD_OOM_SCORE_ADJ"))) + if (sscanf(tmp, "%d", &oom_score_adj) != 1) + eerror("%s: invalid oom_score_adj `%s' (SSD_OOM_SCORE_ADJ)", + applet, tmp); /* Get our user name and initial dir */ p = getenv("USER"); @@ -806,6 +824,12 @@ int main(int argc, char **argv) applet, optarg); break; + case 0x80: /* --oom-score-adj */ + if (sscanf(optarg, "%d", &oom_score_adj) != 1) + eerrorx("%s: invalid oom-score-adj `%s'", + applet, optarg); + break; + case 'P': /* --respawn-period time */ n = sscanf(optarg, "%d", &respawn_period); if (n != 1 || respawn_period < 1) |