aboutsummaryrefslogtreecommitdiff
path: root/src/rc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rc')
-rw-r--r--src/rc/start-stop-daemon.c29
-rw-r--r--src/rc/supervise-daemon.c30
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)