Merge lp:~jamesodhunt/upstart/bug-530779 into lp:upstart

Proposed by James Hunt on 2013-11-28
Status: Needs review
Proposed branch: lp:~jamesodhunt/upstart/bug-530779
Merge into: lp:upstart
Diff against target: 24650 lines (+24167/-52)
13 files modified
ChangeLog (+57/-0)
init/Makefile.am (+2/-1)
init/job.c (+17/-18)
init/job_process.c (+41/-6)
init/process.c (+27/-6)
init/process.h (+6/-0)
init/tests/data/upstart-1.12.json (+21708/-0)
init/tests/test_job_process.c (+483/-10)
init/tests/test_state.c (+190/-10)
test/Makefile.am (+8/-1)
test/test_daemon.c (+1485/-0)
test/test_util_common.c (+116/-0)
test/test_util_common.h (+27/-0)
To merge this branch: bzr merge lp:~jamesodhunt/upstart/bug-530779
Reviewer Review Type Date Requested Status
Steve Langasek 2013-11-28 Needs Fixing on 2013-12-02
Review via email: mp+197080@code.launchpad.net
To post a comment you must log in.
Steve Langasek (vorlon) wrote :

@@ -275,7 +280,18 @@
        if (! state_check_json_type (json_processes, array))
                goto error;

- for (i = 0; i < json_object_array_length (json_processes); i++) {
+ len = json_object_array_length (json_processes);
+
+ if (len > PROCESS_LAST) {
+ /* Detected a downgrade on re-exec scenario (where we
+ * are attempting to restore state from a newer init
+ * which contains additional processes
+ */
+ nih_warn ("%s", _("Detected unsupported downgrade on re-exec"));
+ goto error;
+ }
+
+ for (i = 0; i < len; i++) {
                json_object *json_process;

                nih_assert (i <= PROCESS_LAST);

The result of this is that, instead of deserializing those processes that are known, on any downgrade to a version that tracked fewer processes, all information will be discarded about all processes associated with jobs. This is effectively equivalent to a stateless reexec, and is not a very graceful handling of this case.

I don't feel very strongly in general about supporting downgrades; but in a case such as this where you need to explicitly handle the difference in the number of related processes, it seems to me that a graceful handling is as easy to accomplish as the ungraceful alternative.

review: Needs Fixing
Steve Langasek (vorlon) wrote :
Download full text (3.3 KiB)

+ TEST_FEATURE ("full double-fork daemon test where parent waits for ultimate child");

does not fit the expected structure of a test feature name. Suggest instead:
        TEST_FEATURE ("with daemon where parent waits for ultimate child before exiting");

+ assert0 (prctl (PR_SET_CHILD_SUBREAPER, 1));

Upstart does not depend on PR_SET_CHILD_SUBREAPER being available on the running kernel - the test suite shouldn't either. The test needs to be skipped if this facility is unavailable, or it needs to be rewritten to avoid subreaper entirely.

+ /* Low byte is signal */
+ TEST_EQ (siginfo.si_status, SIGTRAP);
+
+ /* Normally, the next byte would be the ptrace event,
+ * but upstart hasn't yet set PTRACE_O_TRACEEXEC, hence
+ * no ptrace event will be available.
+ */
+ TEST_EQ (((siginfo.si_status & ~0x7f)>>8), 0);

The second test here is redundant with the first; if siginfo.si_status == SIGTRAP, the high byte must be 0. Either the second test should be dropped, or, if you want to keep it for clarity, the first test should be modified to check siginfo.si_status & 0x7f.

+ TIMED_BLOCK (5) {

I'm not thrilled about this TIMED_BLOCK() idea. Why should we not just use inotify? For that matter, why is this pidfile needed at all - what is this meant to guard against? The test case already includes its own direct check of the pids with ptrace, so the only thing this pidfile does is make sure the daemon agrees with the test what the PIDs are. That seems unnecessary to me.

+ /* Wait for child to send itself SIGSTOP denoting its
+ * final resting state.
+ */
+ got = FALSE;
+ TIMED_BLOCK (5) {
+
+ memset (&siginfo, 0, sizeof (siginfo));
+ ret = waitid (P_PID, final_pid, &siginfo, WSTOPPED | WNOWAIT | WUNTRACED);
+
+ if (! ret && siginfo.si_code == CLD_STOPPED &&
+ siginfo.si_status == SIGSTOP) {
+ got = TRUE;
+ break;
+ }
+ }

This section seems overly complicated. The child process could just call pause() instead, and let the test runner kill the process when it's done.

+ TIMED_BLOCK (5) {
+ nih_child_poll ();
+
+ if (kill (final_pid, 0) == -1 && errno == ESRCH) {
+ got = TRUE;
+ break;
+ }
+ }

Definitely no reason for this to be in a TIMED_BLOCK(). Or called at all. We've already received CLD_EXITED above, so the kill() should immediately return ESRCH. But again, this code all goes away if we just kill SIGKILL the final_pid, instead of including these checks that are unrelated to the purpose of the test case.

 static void
 selfpipe_setup (void)
 {
- static struct sigaction act;
- int read_flags;
- int write_flags;
[...]

This mixes formatting cha...

Read more...

review: Needs Fixing
James Hunt (jamesodhunt) wrote :
Download full text (5.7 KiB)

Hi Steve,

I've now updated the deserialisation to make an attempt on the downgrade scenario. Note the comment in process.h though regarding the ordering of ProcessType. I've also raised bug 1256985 whilst looking at this.

> + TEST_FEATURE ("full double-fork daemon test where parent waits for ultimate child");
>
> does not fit the expected structure of a test feature name. Suggest instead:
> TEST_FEATURE ("with daemon where parent waits for ultimate child before exiting");

Fixed.

>
> + assert0 (prctl (PR_SET_CHILD_SUBREAPER, 1));
>
> Upstart does not depend on PR_SET_CHILD_SUBREAPER being available on the running kernel - the test suite shouldn't either. The test needs to be skipped if this facility is unavailable, or it needs to be rewritten to avoid subreaper entirely.

Fixed.

>
> + /* Low byte is signal */
> + TEST_EQ (siginfo.si_status, SIGTRAP);
> +
> + /* Normally, the next byte would be the ptrace event,
> + * but upstart hasn't yet set PTRACE_O_TRACEEXEC, hence
> + * no ptrace event will be available.
> + */
> + TEST_EQ (((siginfo.si_status & ~0x7f)>>8), 0);
>
> The second test here is redundant with the first; if siginfo.si_status == SIGTRAP, the high byte must be 0. Either the second test should be dropped, or, if you want to keep it for clarity, the first test should be modified to check siginfo.si_status & 0x7f.

Fixed.

>
> + TIMED_BLOCK (5) {
>
> I'm not thrilled about this TIMED_BLOCK() idea. Why should we not just use inotify?

To give some context here, it's worth pointing out that this test has been through a few iterations. An earlier incarnation of it was using signals entirely but that is problematic since:

  - test_daemon needed to raise SIGSTOP on itself.
  - test_daemon is being ptraced hence is also getting SIGSTOP's sent to it by the kernel.
  - This is a multi-process test so we need to guarantee behaviour given that we can't know the order the kernel will schedule each process.
  - We don't want to call nih_main_loop() as we cannot then control the test in "single-step" increments (well, as close as we can get to that anyway :-).

Certainly inotify would be the obvious choice but for that fact that it would add further code and complexity to the test since we're avoiding using nih_main_loop().

TIMED_BLOCK offers a rather useful generic facility I think, particularly since a common requirement for the tests is to perform some operation "within a reasonable amount of time" and then fail. Yes, it's tricky to determine the value of "reasonable", but we do need to guarantee a hard test failure, rather than an indefinite hang.

Admittedly, using TIMED_BLOCK() with file_line_count() is rather grisly, but even if we were to use inotify, we'd still need to check the line count on each event as we need to know when a particular parent is in a particular state.

> For that matter, why is this pidfile needed at all - what is this meant to guard against? The test case already includes its own direct check of the pids with ptrace, so the only thing this pidfile does is make sure the daemon agrees with the test what the PIDs are. That seems unnecessary to me.

It's not immediately obvious, but that's not th...

Read more...

lp:~jamesodhunt/upstart/bug-530779 updated on 2013-12-12
1579. By Steve Langasek on 2013-12-04

Merge lp:~clint-fewbar/upstart/typo

1580. By James Hunt on 2013-12-12

* init/tests/data/upstart-1.12.json: New test data file.
* test/test_daemon.c: New test utility.
* init/Makefile.am: Add "upstart-1.12.json".
* init/job.c:
  - Updated copyright.
  - job_deserialise(): Generalise logic to handle missing pids when
    upgrading from a version that does not support PROCESS_SECURITY and
    PROCESS_DAEMON_PARENT.
* init/job_process.c:
  - Copyright and comments.
  - job_process_terminated(): Consider job ready when daemons parent
    exits, rather than when the requisite number of forks have been
    performed (based on lp:~vorlon/upstart/lp.530779-rough-draft)
    (LP: #530779).
  - job_process_trace_new(): Corrected comment header.
  - job_process_trace_new_child(): Don't consider job ready once
    requisite number of forks have occured any more.
  - job_process_trace_fork(): Save parent process.
* init/process.c:
  - Updated copyright.
  - process_name(): Added PROCESS_DAEMON_PARENT for completeness.
  - process_from_name(): Added PROCESS_DAEMON_PARENT for completeness.
  - process_deserialise_all(): Generalise logic to handle missing pids
    when upgrading from a version that does not support PROCESS_SECURITY and
    PROCESS_DAEMON_PARENT.
  - process_type_enum_to_str(): Added PROCESS_DAEMON_PARENT for completeness.
  - process_type_str_to_enum(): Added PROCESS_DAEMON_PARENT for completeness.
* init/process.h: Comments for ProcessType (which must be kept in order).
* init/tests/test_job_process.c:
  - test_run(): New test:
    - "with daemon where parent waits for ultimate child before exiting"
  - test_spawn(): Remove temporary files.
  - test_kill(): Extra checks.
  - test_handler():
    - Remove erroneous UPSTART_LOGDIR code - not used by this test.
    - Add daemon parent checks.
* init/tests/test_state.c:
  - test_job_environ_upgrade(): Add additional checks to ensure that
    json not containing PROCESS_DAEMON_PARENT elements correctly deserialises
    into empty elements.
  - test_daemon_parent_state(): New test that checks a data file containing
    jobs with and without PROCESS_DAEMON_PARENTS can be deserialised.
* test/Makefile.am: Updated for test_daemon.
* test/test_util_common.c:
  - get_test_daemon_binary(): New function.
  - file_line_count(): New function.
* test/test_util_common.h: TIMED_BLOCK(): New utility macro.

James Hunt (jamesodhunt) wrote :

Hi Steve - I've now cleaned up the branch.

Steve Langasek (vorlon) wrote :

>> Upstart does not depend on PR_SET_CHILD_SUBREAPER being
>> available on the running kernel - the test suite shouldn't
>> either. The test needs to be skipped if this facility is
>> unavailable, or it needs to be rewritten to avoid subreaper
>> entirely.

> Fixed.

This is not fixed. You've adjusted the test suite to not fail if PR_SET_CHILD_SUBREAPER is not *defined* at build time; this does not address the problem of it being *unsupported* by the running kernel. The 'assert0 (prctl (PR_SET_CHILD_SUBREAPER, 1))' must be dropped from the test suite, and be replaced by a check that skips the test if it's unavailable.

This probably calls for the test to be broken out into a separate function so that it can be skipped sensibly.

lp:~jamesodhunt/upstart/bug-530779 updated on 2014-01-13
1581. By James Hunt on 2014-01-13

* init/tests/test_job_process.c: test_run_subreaper(): Separate the
  prctl(PR_SET_CHILD_SUBREAPER) test into a new function and only call
  if the running kernel supports that prctl.
* test/test_util_common.c: get_kernel_version(): New function.

1582. By James Hunt on 2014-01-13

* Sync with lp:upstart.

James Hunt (jamesodhunt) wrote :

Hi Steve,

Thanks for reviewing - code updated.

Unmerged revisions

1582. By James Hunt on 2014-01-13

* Sync with lp:upstart.

1581. By James Hunt on 2014-01-13

* init/tests/test_job_process.c: test_run_subreaper(): Separate the
  prctl(PR_SET_CHILD_SUBREAPER) test into a new function and only call
  if the running kernel supports that prctl.
* test/test_util_common.c: get_kernel_version(): New function.

1580. By James Hunt on 2013-12-12

* init/tests/data/upstart-1.12.json: New test data file.
* test/test_daemon.c: New test utility.
* init/Makefile.am: Add "upstart-1.12.json".
* init/job.c:
  - Updated copyright.
  - job_deserialise(): Generalise logic to handle missing pids when
    upgrading from a version that does not support PROCESS_SECURITY and
    PROCESS_DAEMON_PARENT.
* init/job_process.c:
  - Copyright and comments.
  - job_process_terminated(): Consider job ready when daemons parent
    exits, rather than when the requisite number of forks have been
    performed (based on lp:~vorlon/upstart/lp.530779-rough-draft)
    (LP: #530779).
  - job_process_trace_new(): Corrected comment header.
  - job_process_trace_new_child(): Don't consider job ready once
    requisite number of forks have occured any more.
  - job_process_trace_fork(): Save parent process.
* init/process.c:
  - Updated copyright.
  - process_name(): Added PROCESS_DAEMON_PARENT for completeness.
  - process_from_name(): Added PROCESS_DAEMON_PARENT for completeness.
  - process_deserialise_all(): Generalise logic to handle missing pids
    when upgrading from a version that does not support PROCESS_SECURITY and
    PROCESS_DAEMON_PARENT.
  - process_type_enum_to_str(): Added PROCESS_DAEMON_PARENT for completeness.
  - process_type_str_to_enum(): Added PROCESS_DAEMON_PARENT for completeness.
* init/process.h: Comments for ProcessType (which must be kept in order).
* init/tests/test_job_process.c:
  - test_run(): New test:
    - "with daemon where parent waits for ultimate child before exiting"
  - test_spawn(): Remove temporary files.
  - test_kill(): Extra checks.
  - test_handler():
    - Remove erroneous UPSTART_LOGDIR code - not used by this test.
    - Add daemon parent checks.
* init/tests/test_state.c:
  - test_job_environ_upgrade(): Add additional checks to ensure that
    json not containing PROCESS_DAEMON_PARENT elements correctly deserialises
    into empty elements.
  - test_daemon_parent_state(): New test that checks a data file containing
    jobs with and without PROCESS_DAEMON_PARENTS can be deserialised.
* test/Makefile.am: Updated for test_daemon.
* test/test_util_common.c:
  - get_test_daemon_binary(): New function.
  - file_line_count(): New function.
* test/test_util_common.h: TIMED_BLOCK(): New utility macro.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ChangeLog'
2--- ChangeLog 2014-01-08 16:47:16 +0000
3+++ ChangeLog 2014-01-13 13:49:11 +0000
4@@ -1,3 +1,10 @@
5+2014-01-13 James Hunt <james.hunt@ubuntu.com>
6+
7+ * init/tests/test_job_process.c: test_run_subreaper(): Separate the
8+ prctl(PR_SET_CHILD_SUBREAPER) test into a new function and only call
9+ if the running kernel supports that prctl.
10+ * test/test_util_common.c: get_kernel_version(): New function.
11+
12 2014-01-08 James Hunt <james.hunt@ubuntu.com>
13
14 * init/man/init.5: Explain valid syntax for stanzas
15@@ -36,6 +43,56 @@
16 * init/man/init.5: Provide more detail on setuid and setgid stanzas
17 (debian bug#732127).
18
19+2013-12-12 James Hunt <james.hunt@ubuntu.com>
20+
21+ * init/tests/data/upstart-1.12.json: New test data file.
22+ * test/test_daemon.c: New test utility.
23+ * init/Makefile.am: Add "upstart-1.12.json".
24+ * init/job.c:
25+ - Updated copyright.
26+ - job_deserialise(): Generalise logic to handle missing pids when
27+ upgrading from a version that does not support PROCESS_SECURITY and
28+ PROCESS_DAEMON_PARENT.
29+ * init/job_process.c:
30+ - Copyright and comments.
31+ - job_process_terminated(): Consider job ready when daemons parent
32+ exits, rather than when the requisite number of forks have been
33+ performed (based on lp:~vorlon/upstart/lp.530779-rough-draft)
34+ (LP: #530779).
35+ - job_process_trace_new(): Corrected comment header.
36+ - job_process_trace_new_child(): Don't consider job ready once
37+ requisite number of forks have occured any more.
38+ - job_process_trace_fork(): Save parent process.
39+ * init/process.c:
40+ - Updated copyright.
41+ - process_name(): Added PROCESS_DAEMON_PARENT for completeness.
42+ - process_from_name(): Added PROCESS_DAEMON_PARENT for completeness.
43+ - process_deserialise_all(): Generalise logic to handle missing pids
44+ when upgrading from a version that does not support PROCESS_SECURITY and
45+ PROCESS_DAEMON_PARENT.
46+ - process_type_enum_to_str(): Added PROCESS_DAEMON_PARENT for completeness.
47+ - process_type_str_to_enum(): Added PROCESS_DAEMON_PARENT for completeness.
48+ * init/process.h: Comments for ProcessType (which must be kept in order).
49+ * init/tests/test_job_process.c:
50+ - test_run(): New test:
51+ - "with daemon where parent waits for ultimate child before exiting"
52+ - test_spawn(): Remove temporary files.
53+ - test_kill(): Extra checks.
54+ - test_handler():
55+ - Remove erroneous UPSTART_LOGDIR code - not used by this test.
56+ - Add daemon parent checks.
57+ * init/tests/test_state.c:
58+ - test_job_environ_upgrade(): Add additional checks to ensure that
59+ json not containing PROCESS_DAEMON_PARENT elements correctly deserialises
60+ into empty elements.
61+ - test_daemon_parent_state(): New test that checks a data file containing
62+ jobs with and without PROCESS_DAEMON_PARENTS can be deserialised.
63+ * test/Makefile.am: Updated for test_daemon.
64+ * test/test_util_common.c:
65+ - get_test_daemon_binary(): New function.
66+ - file_line_count(): New function.
67+ * test/test_util_common.h: TIMED_BLOCK(): New utility macro.
68+
69 2013-11-23 Steve Langasek <steve.langasek@ubuntu.com>
70
71 * init/tests/test_state.c: fix test case to not assume SIGUSR1 == 10;
72
73=== modified file 'init/Makefile.am'
74--- init/Makefile.am 2013-11-12 14:00:36 +0000
75+++ init/Makefile.am 2014-01-13 13:49:11 +0000
76@@ -145,7 +145,8 @@
77 $(TEST_DATA_DIR)/upstart-session2.json \
78 $(TEST_DATA_DIR)/upstart-session-infinity.json \
79 $(TEST_DATA_DIR)/upstart-1.9.json \
80- $(TEST_DATA_DIR)/upstart-1.11.json
81+ $(TEST_DATA_DIR)/upstart-1.11.json \
82+ $(TEST_DATA_DIR)/upstart-1.12.json
83
84 upstart_test_programs = \
85 test_system \
86
87=== modified file 'init/job.c'
88--- init/job.c 2013-08-21 11:07:36 +0000
89+++ init/job.c 2014-01-13 13:49:11 +0000
90@@ -2,7 +2,7 @@
91 *
92 * job.c - core state machine of tasks and services
93 *
94- * Copyright © 2010,2011 Canonical Ltd.
95+ * Copyright © 2010-2013 Canonical Ltd.
96 * Author: Scott James Remnant <scott@netsplit.com>.
97 *
98 * This program is free software; you can redistribute it and/or modify
99@@ -2015,20 +2015,24 @@
100 if (ret < 0)
101 goto error;
102
103- /* If we are missing one, we're probably importing from a
104- * previous version that didn't include PROCESS_SECURITY.
105- * Simply add the missing one.
106+ /* If we are missing entries, we're probably upgrading from a
107+ * previous version that didn't include PROCESS_SECURITY or
108+ * PROCESS_DAEMON_PARENT. So, set those as null entries.
109+ *
110+ * Downgrades are handled by simply ignoring pids beyond
111+ * PROCESS_LAST.
112 */
113- if (len == PROCESS_LAST - 1) {
114+ if (len < PROCESS_LAST) {
115+ int missing;
116+
117 job->pid = nih_realloc (job->pid, job, sizeof (pid_t) * PROCESS_LAST);
118
119 if (! job->pid)
120 goto error;
121
122- job->pid[PROCESS_LAST - 1] = 0;
123-
124- } else if (len != PROCESS_LAST) {
125- goto error;
126+ for (missing = len; missing < PROCESS_LAST; missing++) {
127+ job->pid[missing] = 0;
128+ }
129 }
130
131 if (! state_get_json_int_var_to_obj (json, job, trace_forks))
132@@ -2047,7 +2051,7 @@
133 if (! state_check_json_type (json_logs, array))
134 goto error;
135
136- for (int process = 0; process < PROCESS_LAST; process++) {
137+ for (size_t process = 0; process < PROCESS_LAST; process++) {
138 json_object *json_log;
139
140 json_log = json_object_array_get_idx (json_logs, process);
141@@ -2058,15 +2062,10 @@
142 */
143 job->log[process] = log_deserialise (job->log, json_log);
144 } else {
145- /* If we are missing one, we're probably importing from a
146- * previous version that didn't include PROCESS_SECURITY.
147- * Simply ignore the missing one.
148+ /* Handle upgrade scenario where process entries are
149+ * missing from the JSON.
150 */
151- if (process == PROCESS_LAST - 1) {
152- job->log[process] = NULL;
153- } else {
154- goto error;
155- }
156+ job->log[process] = NULL;
157 }
158 }
159
160
161=== modified file 'init/job_process.c'
162--- init/job_process.c 2013-11-03 02:54:03 +0000
163+++ init/job_process.c 2014-01-13 13:49:11 +0000
164@@ -2,7 +2,7 @@
165 *
166 * job_process.c - job process handling
167 *
168- * Copyright © 2011 Canonical Ltd.
169+ * Copyright © 2011-2013 Canonical Ltd.
170 * Author: Scott James Remnant <scott@netsplit.com>.
171 *
172 * This program is free software; you can redistribute it and/or modify
173@@ -1583,6 +1583,11 @@
174 || (job->state == JOB_POST_START)
175 || (job->state == JOB_PRE_STOP));
176
177+ /* If the final main process dies, we no longer
178+ * care if there's a daemon parent running.
179+ */
180+ job->pid[PROCESS_DAEMON_PARENT] = 0;
181+
182 /* We don't change the state if we're in post-start and there's
183 * a post-start process running, or if we're in pre-stop and
184 * there's a pre-stop process running; we wait for those to
185@@ -1682,6 +1687,28 @@
186 stop = TRUE;
187 }
188 break;
189+ case PROCESS_DAEMON_PARENT:
190+ nih_assert (job->state == JOB_SPAWNED);
191+
192+ /* If we have a daemon parent, that can only mean that
193+ * this is no longer the main process. So we don't care
194+ * about exit status or anything else, we just either record
195+ * that the process is gone or, if we've seen all the forks
196+ * we expect, move the process straight to JOB_RUNNING. */
197+ nih_assert (job->pid[PROCESS_MAIN] > 0);
198+
199+ switch (job->class->expect) {
200+ case EXPECT_FORK:
201+ state = TRUE;
202+ break;
203+ case EXPECT_DAEMON:
204+ state = (job->trace_forks > 1) ? TRUE : FALSE;
205+ break;
206+ default:
207+ nih_assert_not_reached ();
208+ }
209+
210+ break;
211 case PROCESS_PRE_START:
212 nih_assert (job->state == JOB_PRE_START);
213
214@@ -1744,7 +1771,7 @@
215 job->kill_process = PROCESS_INVALID;
216 }
217
218- if (job->class->console == CONSOLE_LOG && job->log[process]) {
219+ if (job->class->console == CONSOLE_LOG && job->log[process] && process != PROCESS_DAEMON_PARENT) {
220 int ret;
221
222 /* It is imperative that we free the log at this stage to ensure
223@@ -1899,9 +1926,8 @@
224 * @job: job that changed,
225 * @process: specific process.
226 *
227- * This function is called when the traced @process attached to @job calls
228- * its first exec(), still within the Upstart code before passing control
229- * to the new executable.
230+ * This function is called when the traced @process attached to @job is
231+ * first forked.
232 *
233 * It sets the options for the trace so that forks and execs are reported.
234 **/
235@@ -1984,7 +2010,10 @@
236 job->pid[process], strerror (errno));
237
238 job->trace_state = TRACE_NONE;
239- job_change_state (job, job_next_state (job));
240+
241+ /* Note that we don't change state here, since we need
242+ * to wait for the ultimate parent to exit.
243+ */
244 return;
245 }
246
247@@ -2073,6 +2102,12 @@
248 job_name (job), process_name (process),
249 job->pid[process], strerror (errno));
250
251+ /* Record the pid of the parent process so we can check when it
252+ * exits.
253+ */
254+ if (job->pid[PROCESS_DAEMON_PARENT] == 0)
255+ job->pid[PROCESS_DAEMON_PARENT] = job->pid[process];
256+
257 /* Update the process we're supervising which is about to get SIGSTOP
258 * so set the trace options to capture it.
259 */
260
261=== modified file 'init/process.c'
262--- init/process.c 2013-05-23 17:16:03 +0000
263+++ init/process.c 2014-01-13 13:49:11 +0000
264@@ -2,7 +2,7 @@
265 *
266 * process.c - process definition handling
267 *
268- * Copyright © 2009 Canonical Ltd.
269+ * Copyright © 2009-2013 Canonical Ltd.
270 * Author: Scott James Remnant <scott@netsplit.com>.
271 *
272 * This program is free software; you can redistribute it and/or modify
273@@ -88,6 +88,8 @@
274 return N_("post-stop");
275 case PROCESS_SECURITY:
276 return N_("security");
277+ case PROCESS_DAEMON_PARENT:
278+ return N_("daemon-parent");
279 default:
280 return NULL;
281 }
282@@ -118,6 +120,8 @@
283 return PROCESS_POST_STOP;
284 } else if (! strcmp (process, "security")) {
285 return PROCESS_SECURITY;
286+ } else if (! strcmp (process, "daemon-parent")) {
287+ return PROCESS_DAEMON_PARENT;
288 } else {
289 return -1;
290 }
291@@ -262,6 +266,7 @@
292 {
293 json_object *json_processes;
294 int i;
295+ int len;
296
297 nih_assert (json);
298 nih_assert (parent);
299@@ -275,14 +280,28 @@
300 if (! state_check_json_type (json_processes, array))
301 goto error;
302
303- for (i = 0; i < json_object_array_length (json_processes); i++) {
304+ len = json_object_array_length (json_processes);
305+
306+ /* Note that downgrades (where we are attempting to restore
307+ * state from a newer init which contains additional processes)
308+ * are handled by simply ignoring any extra processes beyond
309+ * PROCESS_LAST.
310+ */
311+ for (i = 0; i < PROCESS_LAST; i++) {
312 json_object *json_process;
313
314- nih_assert (i <= PROCESS_LAST);
315-
316 json_process = json_object_array_get_idx (json_processes, i);
317- if (! json_process)
318- goto error;
319+ if (! json_process) {
320+ if (len < PROCESS_LAST) {
321+ /* Handle upgrade scenario where entries
322+ * may be missing.
323+ */
324+ processes[i] = NULL;
325+ continue;
326+ } else {
327+ goto error;
328+ }
329+ }
330
331 if (! state_check_json_type (json_process, object))
332 goto error;
333@@ -316,6 +335,7 @@
334 state_enum_to_str (PROCESS_PRE_STOP, type);
335 state_enum_to_str (PROCESS_POST_STOP, type);
336 state_enum_to_str (PROCESS_SECURITY, type);
337+ state_enum_to_str (PROCESS_DAEMON_PARENT, type);
338
339 return NULL;
340 }
341@@ -341,6 +361,7 @@
342 state_str_to_enum (PROCESS_PRE_STOP, type);
343 state_str_to_enum (PROCESS_POST_STOP, type);
344 state_str_to_enum (PROCESS_SECURITY, type);
345+ state_str_to_enum (PROCESS_DAEMON_PARENT, type);
346
347 return -1;
348 }
349
350=== modified file 'init/process.h'
351--- init/process.h 2013-05-15 13:21:54 +0000
352+++ init/process.h 2014-01-13 13:49:11 +0000
353@@ -35,6 +35,11 @@
354 * between an invalid ProcessType and the default value assigned to a
355 * ProcessType. It also cannot be zero since that would upset iterating
356 * through the (non-invalid) entries.
357+ *
358+ * XXX: Rules required to ensure correct stateful re-exec behaviour:
359+ * XXX:
360+ * XXX: - New process types *MUST* be added just before PROCESS_LAST.
361+ * XXX: - No ordering change for existing values is allowed.
362 **/
363 typedef enum process_type {
364 /* initial value denoting no process */
365@@ -46,6 +51,7 @@
366 PROCESS_PRE_STOP,
367 PROCESS_POST_STOP,
368 PROCESS_SECURITY,
369+ PROCESS_DAEMON_PARENT,
370 PROCESS_LAST,
371 } ProcessType;
372
373
374=== added file 'init/tests/data/upstart-1.12.json'
375--- init/tests/data/upstart-1.12.json 1970-01-01 00:00:00 +0000
376+++ init/tests/data/upstart-1.12.json 2014-01-13 13:49:11 +0000
377@@ -0,0 +1,21708 @@
378+{
379+ "job_classes" : [
380+ {
381+ "setgid" : null,
382+ "deleted" : 0,
383+ "usage" : null,
384+ "chroot" : null,
385+ "author" : "Dmitrijs Ledkovs <dmitrijs.ledkovs@canonical.com>",
386+ "emits" : [],
387+ "process" : [
388+ {
389+ "command" : "reload cups",
390+ "script" : 0
391+ },
392+ {
393+ "script" : 0,
394+ "command" : null
395+ },
396+ {
397+ "script" : 0,
398+ "command" : null
399+ },
400+ {
401+ "script" : 0,
402+ "command" : null
403+ },
404+ {
405+ "command" : null,
406+ "script" : 0
407+ },
408+ {
409+ "command" : null,
410+ "script" : 0
411+ },
412+ {
413+ "script" : 0,
414+ "command" : null
415+ }
416+ ],
417+ "respawn" : 0,
418+ "description" : "Reload cups, upon starting avahi-daemon to make sure remote queues are populated",
419+ "chdir" : null,
420+ "kill_timeout" : 5,
421+ "expect" : "EXPECT_NONE",
422+ "apparmor_switch" : null,
423+ "oom_score_adj" : 0,
424+ "nice" : -21,
425+ "debug" : 0,
426+ "name" : "avahi-cups-reload",
427+ "setuid" : null,
428+ "normalexit" : [],
429+ "respawn_limit" : 10,
430+ "jobs" : [],
431+ "kill_signal" : 15,
432+ "task" : 1,
433+ "reload_signal" : 1,
434+ "session" : 0,
435+ "version" : null,
436+ "env" : [],
437+ "umask" : 18,
438+ "console" : "CONSOLE_LOG",
439+ "export" : [],
440+ "respawn_interval" : 5,
441+ "limits" : [
442+ {
443+ "rlim_cur" : 0,
444+ "rlim_max" : 0
445+ },
446+ {
447+ "rlim_cur" : 0,
448+ "rlim_max" : 0
449+ },
450+ {
451+ "rlim_cur" : 0,
452+ "rlim_max" : 0
453+ },
454+ {
455+ "rlim_cur" : 0,
456+ "rlim_max" : 0
457+ },
458+ {
459+ "rlim_cur" : 0,
460+ "rlim_max" : 0
461+ },
462+ {
463+ "rlim_max" : 0,
464+ "rlim_cur" : 0
465+ },
466+ {
467+ "rlim_cur" : 0,
468+ "rlim_max" : 0
469+ },
470+ {
471+ "rlim_max" : 0,
472+ "rlim_cur" : 0
473+ },
474+ {
475+ "rlim_max" : 0,
476+ "rlim_cur" : 0
477+ },
478+ {
479+ "rlim_max" : 0,
480+ "rlim_cur" : 0
481+ },
482+ {
483+ "rlim_max" : 0,
484+ "rlim_cur" : 0
485+ },
486+ {
487+ "rlim_max" : 0,
488+ "rlim_cur" : 0
489+ },
490+ {
491+ "rlim_cur" : 0,
492+ "rlim_max" : 0
493+ },
494+ {
495+ "rlim_cur" : 0,
496+ "rlim_max" : 0
497+ },
498+ {
499+ "rlim_max" : 0,
500+ "rlim_cur" : 0
501+ },
502+ {
503+ "rlim_cur" : 0,
504+ "rlim_max" : 0
505+ }
506+ ],
507+ "instance" : "",
508+ "start_on" : [
509+ {
510+ "env" : [
511+ "avahi-daemon"
512+ ],
513+ "value" : 0,
514+ "name" : "started",
515+ "type" : "EVENT_MATCH"
516+ }
517+ ],
518+ "path" : "/com/ubuntu/Upstart/jobs/avahi_2dcups_2dreload"
519+ },
520+ {
521+ "version" : null,
522+ "env" : [],
523+ "umask" : 18,
524+ "respawn_interval" : 5,
525+ "limits" : [
526+ {
527+ "rlim_cur" : 0,
528+ "rlim_max" : 0
529+ },
530+ {
531+ "rlim_cur" : 0,
532+ "rlim_max" : 0
533+ },
534+ {
535+ "rlim_cur" : 0,
536+ "rlim_max" : 0
537+ },
538+ {
539+ "rlim_cur" : 0,
540+ "rlim_max" : 0
541+ },
542+ {
543+ "rlim_max" : 0,
544+ "rlim_cur" : 0
545+ },
546+ {
547+ "rlim_cur" : 0,
548+ "rlim_max" : 0
549+ },
550+ {
551+ "rlim_cur" : 0,
552+ "rlim_max" : 0
553+ },
554+ {
555+ "rlim_max" : 0,
556+ "rlim_cur" : 0
557+ },
558+ {
559+ "rlim_cur" : 0,
560+ "rlim_max" : 0
561+ },
562+ {
563+ "rlim_cur" : 0,
564+ "rlim_max" : 0
565+ },
566+ {
567+ "rlim_cur" : 0,
568+ "rlim_max" : 0
569+ },
570+ {
571+ "rlim_max" : 0,
572+ "rlim_cur" : 0
573+ },
574+ {
575+ "rlim_max" : 0,
576+ "rlim_cur" : 0
577+ },
578+ {
579+ "rlim_cur" : 0,
580+ "rlim_max" : 0
581+ },
582+ {
583+ "rlim_max" : 0,
584+ "rlim_cur" : 0
585+ },
586+ {
587+ "rlim_cur" : 0,
588+ "rlim_max" : 0
589+ }
590+ ],
591+ "instance" : "",
592+ "start_on" : [
593+ {
594+ "name" : "filesystem",
595+ "value" : 0,
596+ "type" : "EVENT_MATCH"
597+ },
598+ {
599+ "env" : [
600+ "dbus"
601+ ],
602+ "value" : 0,
603+ "name" : "started",
604+ "type" : "EVENT_MATCH"
605+ },
606+ {
607+ "type" : "EVENT_AND",
608+ "value" : 0
609+ }
610+ ],
611+ "path" : "/com/ubuntu/Upstart/jobs/avahi_2ddaemon",
612+ "console" : "CONSOLE_LOG",
613+ "export" : [],
614+ "setuid" : null,
615+ "normalexit" : [],
616+ "oom_score_adj" : 0,
617+ "nice" : -21,
618+ "debug" : 0,
619+ "name" : "avahi-daemon",
620+ "kill_signal" : 15,
621+ "task" : 0,
622+ "reload_signal" : 1,
623+ "session" : 0,
624+ "respawn_limit" : 10,
625+ "jobs" : [
626+ {
627+ "failed_process" : "PROCESS_INVALID",
628+ "stop_env" : [],
629+ "log" : [
630+ {
631+ "path" : null
632+ },
633+ {
634+ "path" : null
635+ },
636+ {
637+ "path" : null
638+ },
639+ {
640+ "path" : null
641+ },
642+ {
643+ "path" : null
644+ },
645+ {
646+ "path" : null
647+ },
648+ {
649+ "path" : null
650+ }
651+ ],
652+ "name" : "",
653+ "exit_status" : 0,
654+ "trace_forks" : 2,
655+ "stop_on" : [
656+ {
657+ "env" : [
658+ "dbus"
659+ ],
660+ "value" : 0,
661+ "name" : "stopping",
662+ "type" : "EVENT_MATCH"
663+ }
664+ ],
665+ "trace_state" : "TRACE_NONE",
666+ "state" : "JOB_RUNNING",
667+ "start_env" : [],
668+ "kill_process" : "PROCESS_INVALID",
669+ "pid" : [
670+ 806,
671+ 0,
672+ 0,
673+ 0,
674+ 0,
675+ 0,
676+ 0
677+ ],
678+ "goal" : "JOB_START",
679+ "fds" : [],
680+ "env" : [
681+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
682+ "TERM=linux",
683+ "JOB=dbus",
684+ "INSTANCE=",
685+ "UPSTART_EVENTS=filesystem started"
686+ ],
687+ "respawn_count" : 0,
688+ "respawn_time" : 0,
689+ "path" : "/com/ubuntu/Upstart/jobs/avahi_2ddaemon/_",
690+ "failed" : 0
691+ }
692+ ],
693+ "kill_timeout" : 5,
694+ "expect" : "EXPECT_DAEMON",
695+ "process" : [
696+ {
697+ "script" : 1,
698+ "command" : "opts=\"-D\"\n[ -e \"/etc/eucalyptus/avahi-daemon.conf\" ] && opts=\"${opts} -f /etc/eucalyptus/avahi-daemon.conf\"\nexec avahi-daemon ${opts}\n"
699+ },
700+ {
701+ "command" : "/lib/init/apparmor-profile-load usr.sbin.avahi-daemon\n",
702+ "script" : 1
703+ },
704+ {
705+ "command" : null,
706+ "script" : 0
707+ },
708+ {
709+ "script" : 0,
710+ "command" : null
711+ },
712+ {
713+ "command" : null,
714+ "script" : 0
715+ },
716+ {
717+ "command" : null,
718+ "script" : 0
719+ },
720+ {
721+ "command" : null,
722+ "script" : 0
723+ }
724+ ],
725+ "chdir" : null,
726+ "respawn" : 1,
727+ "description" : "mDNS/DNS-SD daemon",
728+ "apparmor_switch" : null,
729+ "usage" : null,
730+ "chroot" : null,
731+ "author" : null,
732+ "deleted" : 0,
733+ "setgid" : null,
734+ "emits" : [],
735+ "stop_on" : [
736+ {
737+ "type" : "EVENT_MATCH",
738+ "value" : 0,
739+ "name" : "stopping",
740+ "env" : [
741+ "dbus"
742+ ]
743+ }
744+ ]
745+ },
746+ {
747+ "version" : null,
748+ "umask" : 18,
749+ "env" : [],
750+ "limits" : [
751+ {
752+ "rlim_cur" : 0,
753+ "rlim_max" : 0
754+ },
755+ {
756+ "rlim_cur" : 0,
757+ "rlim_max" : 0
758+ },
759+ {
760+ "rlim_cur" : 0,
761+ "rlim_max" : 0
762+ },
763+ {
764+ "rlim_cur" : 0,
765+ "rlim_max" : 0
766+ },
767+ {
768+ "rlim_max" : 0,
769+ "rlim_cur" : 0
770+ },
771+ {
772+ "rlim_cur" : 0,
773+ "rlim_max" : 0
774+ },
775+ {
776+ "rlim_cur" : 0,
777+ "rlim_max" : 0
778+ },
779+ {
780+ "rlim_max" : 0,
781+ "rlim_cur" : 0
782+ },
783+ {
784+ "rlim_max" : 0,
785+ "rlim_cur" : 0
786+ },
787+ {
788+ "rlim_max" : 0,
789+ "rlim_cur" : 0
790+ },
791+ {
792+ "rlim_max" : 0,
793+ "rlim_cur" : 0
794+ },
795+ {
796+ "rlim_cur" : 0,
797+ "rlim_max" : 0
798+ },
799+ {
800+ "rlim_cur" : 0,
801+ "rlim_max" : 0
802+ },
803+ {
804+ "rlim_max" : 0,
805+ "rlim_cur" : 0
806+ },
807+ {
808+ "rlim_cur" : 0,
809+ "rlim_max" : 0
810+ },
811+ {
812+ "rlim_cur" : 0,
813+ "rlim_max" : 0
814+ }
815+ ],
816+ "start_on" : [
817+ {
818+ "env" : [
819+ "MOUNTPOINT=/sys/fs/cgroup"
820+ ],
821+ "value" : 0,
822+ "name" : "mounted",
823+ "type" : "EVENT_MATCH"
824+ }
825+ ],
826+ "instance" : "",
827+ "path" : "/com/ubuntu/Upstart/jobs/cgroup_2dlite",
828+ "respawn_interval" : 5,
829+ "export" : [],
830+ "console" : "CONSOLE_LOG",
831+ "normalexit" : [],
832+ "setuid" : null,
833+ "debug" : 0,
834+ "name" : "cgroup-lite",
835+ "nice" : -21,
836+ "oom_score_adj" : 0,
837+ "session" : 0,
838+ "reload_signal" : 1,
839+ "task" : 0,
840+ "kill_signal" : 15,
841+ "respawn_limit" : 10,
842+ "jobs" : [
843+ {
844+ "exit_status" : 0,
845+ "name" : "",
846+ "stop_env" : [],
847+ "failed_process" : "PROCESS_INVALID",
848+ "log" : [
849+ {
850+ "path" : null
851+ },
852+ {
853+ "path" : null
854+ },
855+ {
856+ "path" : null
857+ },
858+ {
859+ "path" : null
860+ },
861+ {
862+ "path" : null
863+ },
864+ {
865+ "path" : null
866+ },
867+ {
868+ "path" : null
869+ }
870+ ],
871+ "goal" : "JOB_START",
872+ "kill_process" : "PROCESS_INVALID",
873+ "start_env" : [],
874+ "pid" : [
875+ 0,
876+ 0,
877+ 0,
878+ 0,
879+ 0,
880+ 0,
881+ 0
882+ ],
883+ "trace_state" : "TRACE_NONE",
884+ "state" : "JOB_RUNNING",
885+ "trace_forks" : 0,
886+ "env" : [
887+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
888+ "TERM=linux",
889+ "DEVICE=none",
890+ "MOUNTPOINT=/sys/fs/cgroup",
891+ "TYPE=tmpfs",
892+ "OPTIONS=optional,uid=0,gid=0,mode=0755,size=1024",
893+ "UPSTART_EVENTS=mounted"
894+ ],
895+ "fds" : [],
896+ "path" : "/com/ubuntu/Upstart/jobs/cgroup_2dlite/_",
897+ "failed" : 0,
898+ "respawn_count" : 0,
899+ "respawn_time" : 0
900+ }
901+ ],
902+ "expect" : "EXPECT_NONE",
903+ "kill_timeout" : 5,
904+ "description" : "mount available cgroup filesystems",
905+ "respawn" : 0,
906+ "chdir" : null,
907+ "process" : [
908+ {
909+ "command" : null,
910+ "script" : 0
911+ },
912+ {
913+ "script" : 1,
914+ "command" : "test -x /bin/cgroups-mount || { stop; exit 0; }\ntest -d /sys/fs/cgroup || { stop; exit 0; }\n/bin/cgroups-mount\n"
915+ },
916+ {
917+ "command" : null,
918+ "script" : 0
919+ },
920+ {
921+ "script" : 0,
922+ "command" : null
923+ },
924+ {
925+ "script" : 1,
926+ "command" : "if [ -x /bin/cgroups-umount ]\nthen\n\t/bin/cgroups-umount\nfi\n"
927+ },
928+ {
929+ "script" : 0,
930+ "command" : null
931+ },
932+ {
933+ "command" : null,
934+ "script" : 0
935+ }
936+ ],
937+ "apparmor_switch" : null,
938+ "author" : "Serge Hallyn <serge.hallyn@canonical.com>",
939+ "usage" : null,
940+ "chroot" : null,
941+ "deleted" : 0,
942+ "setgid" : null,
943+ "emits" : []
944+ },
945+ {
946+ "emits" : [],
947+ "chroot" : null,
948+ "usage" : null,
949+ "author" : null,
950+ "deleted" : 0,
951+ "setgid" : null,
952+ "apparmor_switch" : null,
953+ "kill_timeout" : 5,
954+ "expect" : "EXPECT_NONE",
955+ "process" : [
956+ {
957+ "script" : 1,
958+ "command" : "PID=$(status mountall 2>/dev/null | sed -e '/start\\/running,/{s/.*,[^0-9]*//;q};d')\n[ -n \"$PID\" ] && kill -USR1 $PID || true\n"
959+ },
960+ {
961+ "script" : 0,
962+ "command" : null
963+ },
964+ {
965+ "command" : null,
966+ "script" : 0
967+ },
968+ {
969+ "command" : null,
970+ "script" : 0
971+ },
972+ {
973+ "script" : 0,
974+ "command" : null
975+ },
976+ {
977+ "command" : null,
978+ "script" : 0
979+ },
980+ {
981+ "script" : 0,
982+ "command" : null
983+ }
984+ ],
985+ "respawn" : 0,
986+ "description" : "Mount network filesystems",
987+ "chdir" : null,
988+ "kill_signal" : 15,
989+ "task" : 1,
990+ "reload_signal" : 1,
991+ "session" : 0,
992+ "jobs" : [],
993+ "respawn_limit" : 10,
994+ "normalexit" : [],
995+ "setuid" : null,
996+ "nice" : -21,
997+ "oom_score_adj" : 0,
998+ "name" : "mountall-net",
999+ "debug" : 0,
1000+ "respawn_interval" : 5,
1001+ "path" : "/com/ubuntu/Upstart/jobs/mountall_2dnet",
1002+ "limits" : [
1003+ {
1004+ "rlim_max" : 0,
1005+ "rlim_cur" : 0
1006+ },
1007+ {
1008+ "rlim_max" : 0,
1009+ "rlim_cur" : 0
1010+ },
1011+ {
1012+ "rlim_max" : 0,
1013+ "rlim_cur" : 0
1014+ },
1015+ {
1016+ "rlim_cur" : 0,
1017+ "rlim_max" : 0
1018+ },
1019+ {
1020+ "rlim_cur" : 0,
1021+ "rlim_max" : 0
1022+ },
1023+ {
1024+ "rlim_max" : 0,
1025+ "rlim_cur" : 0
1026+ },
1027+ {
1028+ "rlim_max" : 0,
1029+ "rlim_cur" : 0
1030+ },
1031+ {
1032+ "rlim_max" : 0,
1033+ "rlim_cur" : 0
1034+ },
1035+ {
1036+ "rlim_max" : 0,
1037+ "rlim_cur" : 0
1038+ },
1039+ {
1040+ "rlim_max" : 0,
1041+ "rlim_cur" : 0
1042+ },
1043+ {
1044+ "rlim_max" : 0,
1045+ "rlim_cur" : 0
1046+ },
1047+ {
1048+ "rlim_cur" : 0,
1049+ "rlim_max" : 0
1050+ },
1051+ {
1052+ "rlim_max" : 0,
1053+ "rlim_cur" : 0
1054+ },
1055+ {
1056+ "rlim_max" : 0,
1057+ "rlim_cur" : 0
1058+ },
1059+ {
1060+ "rlim_cur" : 0,
1061+ "rlim_max" : 0
1062+ },
1063+ {
1064+ "rlim_cur" : 0,
1065+ "rlim_max" : 0
1066+ }
1067+ ],
1068+ "instance" : "",
1069+ "start_on" : [
1070+ {
1071+ "name" : "net-device-up",
1072+ "value" : 0,
1073+ "type" : "EVENT_MATCH"
1074+ }
1075+ ],
1076+ "console" : "CONSOLE_LOG",
1077+ "export" : [],
1078+ "umask" : 18,
1079+ "env" : [],
1080+ "version" : null
1081+ },
1082+ {
1083+ "respawn_limit" : 10,
1084+ "jobs" : [
1085+ {
1086+ "exit_status" : 0,
1087+ "name" : "",
1088+ "stop_env" : [],
1089+ "failed_process" : "PROCESS_INVALID",
1090+ "log" : [
1091+ {
1092+ "path" : null
1093+ },
1094+ {
1095+ "path" : null
1096+ },
1097+ {
1098+ "path" : null
1099+ },
1100+ {
1101+ "path" : null
1102+ },
1103+ {
1104+ "path" : null
1105+ },
1106+ {
1107+ "path" : null
1108+ },
1109+ {
1110+ "path" : null
1111+ }
1112+ ],
1113+ "goal" : "JOB_START",
1114+ "kill_process" : "PROCESS_INVALID",
1115+ "start_env" : [],
1116+ "pid" : [
1117+ 0,
1118+ 0,
1119+ 0,
1120+ 0,
1121+ 0,
1122+ 0,
1123+ 0
1124+ ],
1125+ "trace_state" : "TRACE_NONE",
1126+ "state" : "JOB_RUNNING",
1127+ "trace_forks" : 0,
1128+ "env" : [
1129+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
1130+ "TERM=linux",
1131+ "UPSTART_EVENTS=virtual-filesystems"
1132+ ],
1133+ "fds" : [],
1134+ "path" : "/com/ubuntu/Upstart/jobs/mountnfs_2dbootclean_2esh/_",
1135+ "failed" : 0,
1136+ "respawn_count" : 0,
1137+ "respawn_time" : 0
1138+ }
1139+ ],
1140+ "session" : 0,
1141+ "reload_signal" : 1,
1142+ "kill_signal" : 15,
1143+ "task" : 0,
1144+ "debug" : 0,
1145+ "name" : "mountnfs-bootclean.sh",
1146+ "nice" : -21,
1147+ "oom_score_adj" : 0,
1148+ "normalexit" : [],
1149+ "setuid" : null,
1150+ "export" : [],
1151+ "console" : "CONSOLE_LOG",
1152+ "instance" : "",
1153+ "limits" : [
1154+ {
1155+ "rlim_max" : 0,
1156+ "rlim_cur" : 0
1157+ },
1158+ {
1159+ "rlim_cur" : 0,
1160+ "rlim_max" : 0
1161+ },
1162+ {
1163+ "rlim_max" : 0,
1164+ "rlim_cur" : 0
1165+ },
1166+ {
1167+ "rlim_max" : 0,
1168+ "rlim_cur" : 0
1169+ },
1170+ {
1171+ "rlim_cur" : 0,
1172+ "rlim_max" : 0
1173+ },
1174+ {
1175+ "rlim_max" : 0,
1176+ "rlim_cur" : 0
1177+ },
1178+ {
1179+ "rlim_max" : 0,
1180+ "rlim_cur" : 0
1181+ },
1182+ {
1183+ "rlim_max" : 0,
1184+ "rlim_cur" : 0
1185+ },
1186+ {
1187+ "rlim_cur" : 0,
1188+ "rlim_max" : 0
1189+ },
1190+ {
1191+ "rlim_cur" : 0,
1192+ "rlim_max" : 0
1193+ },
1194+ {
1195+ "rlim_cur" : 0,
1196+ "rlim_max" : 0
1197+ },
1198+ {
1199+ "rlim_max" : 0,
1200+ "rlim_cur" : 0
1201+ },
1202+ {
1203+ "rlim_max" : 0,
1204+ "rlim_cur" : 0
1205+ },
1206+ {
1207+ "rlim_cur" : 0,
1208+ "rlim_max" : 0
1209+ },
1210+ {
1211+ "rlim_cur" : 0,
1212+ "rlim_max" : 0
1213+ },
1214+ {
1215+ "rlim_cur" : 0,
1216+ "rlim_max" : 0
1217+ }
1218+ ],
1219+ "start_on" : [
1220+ {
1221+ "value" : 0,
1222+ "name" : "virtual-filesystems",
1223+ "type" : "EVENT_MATCH"
1224+ }
1225+ ],
1226+ "path" : "/com/ubuntu/Upstart/jobs/mountnfs_2dbootclean_2esh",
1227+ "respawn_interval" : 5,
1228+ "version" : null,
1229+ "env" : [],
1230+ "umask" : 18,
1231+ "emits" : [],
1232+ "setgid" : null,
1233+ "deleted" : 0,
1234+ "usage" : null,
1235+ "chroot" : null,
1236+ "author" : null,
1237+ "apparmor_switch" : null,
1238+ "respawn" : 0,
1239+ "description" : null,
1240+ "chdir" : null,
1241+ "process" : [
1242+ {
1243+ "script" : 0,
1244+ "command" : null
1245+ },
1246+ {
1247+ "command" : null,
1248+ "script" : 0
1249+ },
1250+ {
1251+ "command" : null,
1252+ "script" : 0
1253+ },
1254+ {
1255+ "command" : null,
1256+ "script" : 0
1257+ },
1258+ {
1259+ "command" : null,
1260+ "script" : 0
1261+ },
1262+ {
1263+ "script" : 0,
1264+ "command" : null
1265+ },
1266+ {
1267+ "script" : 0,
1268+ "command" : null
1269+ }
1270+ ],
1271+ "expect" : "EXPECT_NONE",
1272+ "kill_timeout" : 5
1273+ },
1274+ {
1275+ "process" : [
1276+ {
1277+ "command" : "rm -f /etc/gshadow.lock /etc/shadow.lock /etc/passwd.lock /etc/group.lock",
1278+ "script" : 0
1279+ },
1280+ {
1281+ "command" : null,
1282+ "script" : 0
1283+ },
1284+ {
1285+ "command" : null,
1286+ "script" : 0
1287+ },
1288+ {
1289+ "script" : 0,
1290+ "command" : null
1291+ },
1292+ {
1293+ "script" : 0,
1294+ "command" : null
1295+ },
1296+ {
1297+ "script" : 0,
1298+ "command" : null
1299+ },
1300+ {
1301+ "script" : 0,
1302+ "command" : null
1303+ }
1304+ ],
1305+ "description" : "Clear passwd locks",
1306+ "chdir" : null,
1307+ "respawn" : 0,
1308+ "kill_timeout" : 5,
1309+ "expect" : "EXPECT_NONE",
1310+ "apparmor_switch" : null,
1311+ "deleted" : 0,
1312+ "setgid" : null,
1313+ "usage" : null,
1314+ "chroot" : null,
1315+ "author" : null,
1316+ "emits" : [],
1317+ "umask" : 18,
1318+ "env" : [],
1319+ "version" : null,
1320+ "console" : "CONSOLE_LOG",
1321+ "export" : [],
1322+ "respawn_interval" : 5,
1323+ "path" : "/com/ubuntu/Upstart/jobs/passwd",
1324+ "start_on" : [
1325+ {
1326+ "value" : 0,
1327+ "name" : "filesystem",
1328+ "type" : "EVENT_MATCH"
1329+ }
1330+ ],
1331+ "limits" : [
1332+ {
1333+ "rlim_max" : 0,
1334+ "rlim_cur" : 0
1335+ },
1336+ {
1337+ "rlim_cur" : 0,
1338+ "rlim_max" : 0
1339+ },
1340+ {
1341+ "rlim_cur" : 0,
1342+ "rlim_max" : 0
1343+ },
1344+ {
1345+ "rlim_max" : 0,
1346+ "rlim_cur" : 0
1347+ },
1348+ {
1349+ "rlim_cur" : 0,
1350+ "rlim_max" : 0
1351+ },
1352+ {
1353+ "rlim_cur" : 0,
1354+ "rlim_max" : 0
1355+ },
1356+ {
1357+ "rlim_max" : 0,
1358+ "rlim_cur" : 0
1359+ },
1360+ {
1361+ "rlim_cur" : 0,
1362+ "rlim_max" : 0
1363+ },
1364+ {
1365+ "rlim_max" : 0,
1366+ "rlim_cur" : 0
1367+ },
1368+ {
1369+ "rlim_cur" : 0,
1370+ "rlim_max" : 0
1371+ },
1372+ {
1373+ "rlim_max" : 0,
1374+ "rlim_cur" : 0
1375+ },
1376+ {
1377+ "rlim_cur" : 0,
1378+ "rlim_max" : 0
1379+ },
1380+ {
1381+ "rlim_cur" : 0,
1382+ "rlim_max" : 0
1383+ },
1384+ {
1385+ "rlim_max" : 0,
1386+ "rlim_cur" : 0
1387+ },
1388+ {
1389+ "rlim_cur" : 0,
1390+ "rlim_max" : 0
1391+ },
1392+ {
1393+ "rlim_cur" : 0,
1394+ "rlim_max" : 0
1395+ }
1396+ ],
1397+ "instance" : "",
1398+ "nice" : -21,
1399+ "oom_score_adj" : 0,
1400+ "name" : "passwd",
1401+ "debug" : 0,
1402+ "normalexit" : [],
1403+ "setuid" : null,
1404+ "jobs" : [],
1405+ "respawn_limit" : 10,
1406+ "task" : 1,
1407+ "kill_signal" : 15,
1408+ "session" : 0,
1409+ "reload_signal" : 1
1410+ },
1411+ {
1412+ "debug" : 0,
1413+ "name" : "rc",
1414+ "nice" : -21,
1415+ "oom_score_adj" : 0,
1416+ "setuid" : null,
1417+ "normalexit" : [],
1418+ "respawn_limit" : 10,
1419+ "jobs" : [],
1420+ "session" : 0,
1421+ "reload_signal" : 1,
1422+ "task" : 1,
1423+ "kill_signal" : 15,
1424+ "version" : null,
1425+ "umask" : 18,
1426+ "env" : [
1427+ "INIT_VERBOSE"
1428+ ],
1429+ "export" : [
1430+ "RUNLEVEL",
1431+ "PREVLEVEL"
1432+ ],
1433+ "console" : "CONSOLE_OUTPUT",
1434+ "limits" : [
1435+ {
1436+ "rlim_max" : 0,
1437+ "rlim_cur" : 0
1438+ },
1439+ {
1440+ "rlim_max" : 0,
1441+ "rlim_cur" : 0
1442+ },
1443+ {
1444+ "rlim_cur" : 0,
1445+ "rlim_max" : 0
1446+ },
1447+ {
1448+ "rlim_max" : 0,
1449+ "rlim_cur" : 0
1450+ },
1451+ {
1452+ "rlim_max" : 0,
1453+ "rlim_cur" : 0
1454+ },
1455+ {
1456+ "rlim_cur" : 0,
1457+ "rlim_max" : 0
1458+ },
1459+ {
1460+ "rlim_max" : 0,
1461+ "rlim_cur" : 0
1462+ },
1463+ {
1464+ "rlim_max" : 0,
1465+ "rlim_cur" : 0
1466+ },
1467+ {
1468+ "rlim_max" : 0,
1469+ "rlim_cur" : 0
1470+ },
1471+ {
1472+ "rlim_max" : 0,
1473+ "rlim_cur" : 0
1474+ },
1475+ {
1476+ "rlim_cur" : 0,
1477+ "rlim_max" : 0
1478+ },
1479+ {
1480+ "rlim_max" : 0,
1481+ "rlim_cur" : 0
1482+ },
1483+ {
1484+ "rlim_max" : 0,
1485+ "rlim_cur" : 0
1486+ },
1487+ {
1488+ "rlim_max" : 0,
1489+ "rlim_cur" : 0
1490+ },
1491+ {
1492+ "rlim_cur" : 0,
1493+ "rlim_max" : 0
1494+ },
1495+ {
1496+ "rlim_cur" : 0,
1497+ "rlim_max" : 0
1498+ }
1499+ ],
1500+ "start_on" : [
1501+ {
1502+ "env" : [
1503+ "[0123456]"
1504+ ],
1505+ "type" : "EVENT_MATCH",
1506+ "name" : "runlevel",
1507+ "value" : 0
1508+ }
1509+ ],
1510+ "instance" : "",
1511+ "path" : "/com/ubuntu/Upstart/jobs/rc",
1512+ "respawn_interval" : 5,
1513+ "deleted" : 0,
1514+ "setgid" : null,
1515+ "usage" : null,
1516+ "author" : "Scott James Remnant <scott@netsplit.com>",
1517+ "chroot" : null,
1518+ "stop_on" : [
1519+ {
1520+ "env" : [
1521+ "[!$RUNLEVEL]"
1522+ ],
1523+ "type" : "EVENT_MATCH",
1524+ "value" : 0,
1525+ "name" : "runlevel"
1526+ }
1527+ ],
1528+ "emits" : [
1529+ "deconfiguring-networking",
1530+ "unmounted-remote-filesystems"
1531+ ],
1532+ "chdir" : null,
1533+ "respawn" : 0,
1534+ "description" : "System V runlevel compatibility",
1535+ "process" : [
1536+ {
1537+ "script" : 0,
1538+ "command" : "/etc/init.d/rc $RUNLEVEL"
1539+ },
1540+ {
1541+ "script" : 0,
1542+ "command" : null
1543+ },
1544+ {
1545+ "command" : null,
1546+ "script" : 0
1547+ },
1548+ {
1549+ "script" : 0,
1550+ "command" : null
1551+ },
1552+ {
1553+ "script" : 0,
1554+ "command" : null
1555+ },
1556+ {
1557+ "script" : 0,
1558+ "command" : null
1559+ },
1560+ {
1561+ "script" : 0,
1562+ "command" : null
1563+ }
1564+ ],
1565+ "expect" : "EXPECT_NONE",
1566+ "kill_timeout" : 5,
1567+ "apparmor_switch" : null
1568+ },
1569+ {
1570+ "apparmor_switch" : null,
1571+ "kill_timeout" : 5,
1572+ "expect" : "EXPECT_FORK",
1573+ "process" : [
1574+ {
1575+ "command" : ". /etc/default/rsyslog\nexec rsyslogd $RSYSLOGD_OPTIONS\n",
1576+ "script" : 1
1577+ },
1578+ {
1579+ "command" : "/lib/init/apparmor-profile-load usr.sbin.rsyslogd\n",
1580+ "script" : 1
1581+ },
1582+ {
1583+ "command" : null,
1584+ "script" : 0
1585+ },
1586+ {
1587+ "command" : null,
1588+ "script" : 0
1589+ },
1590+ {
1591+ "command" : null,
1592+ "script" : 0
1593+ },
1594+ {
1595+ "command" : null,
1596+ "script" : 0
1597+ },
1598+ {
1599+ "script" : 0,
1600+ "command" : null
1601+ }
1602+ ],
1603+ "respawn" : 1,
1604+ "chdir" : null,
1605+ "description" : "system logging daemon",
1606+ "emits" : [],
1607+ "stop_on" : [
1608+ {
1609+ "env" : [
1610+ "[06]"
1611+ ],
1612+ "name" : "runlevel",
1613+ "value" : 0,
1614+ "type" : "EVENT_MATCH"
1615+ }
1616+ ],
1617+ "author" : null,
1618+ "usage" : null,
1619+ "chroot" : null,
1620+ "setgid" : null,
1621+ "deleted" : 0,
1622+ "respawn_interval" : 5,
1623+ "instance" : "",
1624+ "limits" : [
1625+ {
1626+ "rlim_max" : 0,
1627+ "rlim_cur" : 0
1628+ },
1629+ {
1630+ "rlim_max" : 0,
1631+ "rlim_cur" : 0
1632+ },
1633+ {
1634+ "rlim_cur" : 0,
1635+ "rlim_max" : 0
1636+ },
1637+ {
1638+ "rlim_max" : 0,
1639+ "rlim_cur" : 0
1640+ },
1641+ {
1642+ "rlim_cur" : 0,
1643+ "rlim_max" : 0
1644+ },
1645+ {
1646+ "rlim_cur" : 0,
1647+ "rlim_max" : 0
1648+ },
1649+ {
1650+ "rlim_cur" : 0,
1651+ "rlim_max" : 0
1652+ },
1653+ {
1654+ "rlim_max" : 0,
1655+ "rlim_cur" : 0
1656+ },
1657+ {
1658+ "rlim_cur" : 0,
1659+ "rlim_max" : 0
1660+ },
1661+ {
1662+ "rlim_max" : 0,
1663+ "rlim_cur" : 0
1664+ },
1665+ {
1666+ "rlim_cur" : 0,
1667+ "rlim_max" : 0
1668+ },
1669+ {
1670+ "rlim_max" : 0,
1671+ "rlim_cur" : 0
1672+ },
1673+ {
1674+ "rlim_max" : 0,
1675+ "rlim_cur" : 0
1676+ },
1677+ {
1678+ "rlim_cur" : 0,
1679+ "rlim_max" : 0
1680+ },
1681+ {
1682+ "rlim_cur" : 0,
1683+ "rlim_max" : 0
1684+ },
1685+ {
1686+ "rlim_max" : 0,
1687+ "rlim_cur" : 0
1688+ }
1689+ ],
1690+ "start_on" : [
1691+ {
1692+ "name" : "filesystem",
1693+ "value" : 0,
1694+ "type" : "EVENT_MATCH"
1695+ }
1696+ ],
1697+ "path" : "/com/ubuntu/Upstart/jobs/rsyslog",
1698+ "console" : "CONSOLE_LOG",
1699+ "export" : [],
1700+ "version" : null,
1701+ "env" : [],
1702+ "umask" : 18,
1703+ "task" : 0,
1704+ "kill_signal" : 15,
1705+ "session" : 0,
1706+ "reload_signal" : 1,
1707+ "respawn_limit" : 10,
1708+ "jobs" : [
1709+ {
1710+ "trace_forks" : 1,
1711+ "stop_on" : [
1712+ {
1713+ "env" : [
1714+ "[06]"
1715+ ],
1716+ "name" : "runlevel",
1717+ "value" : 0,
1718+ "type" : "EVENT_MATCH"
1719+ }
1720+ ],
1721+ "trace_state" : "TRACE_NONE",
1722+ "state" : "JOB_RUNNING",
1723+ "start_env" : [],
1724+ "kill_process" : "PROCESS_INVALID",
1725+ "pid" : [
1726+ 747,
1727+ 0,
1728+ 0,
1729+ 0,
1730+ 0,
1731+ 0,
1732+ 0
1733+ ],
1734+ "goal" : "JOB_START",
1735+ "stop_env" : [],
1736+ "failed_process" : "PROCESS_INVALID",
1737+ "log" : [
1738+ {
1739+ "path" : null
1740+ },
1741+ {
1742+ "path" : null
1743+ },
1744+ {
1745+ "path" : null
1746+ },
1747+ {
1748+ "path" : null
1749+ },
1750+ {
1751+ "path" : null
1752+ },
1753+ {
1754+ "path" : null
1755+ },
1756+ {
1757+ "path" : null
1758+ }
1759+ ],
1760+ "name" : "",
1761+ "exit_status" : 0,
1762+ "respawn_count" : 0,
1763+ "respawn_time" : 0,
1764+ "path" : "/com/ubuntu/Upstart/jobs/rsyslog/_",
1765+ "failed" : 0,
1766+ "fds" : [],
1767+ "env" : [
1768+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
1769+ "TERM=linux",
1770+ "UPSTART_EVENTS=filesystem"
1771+ ]
1772+ }
1773+ ],
1774+ "normalexit" : [],
1775+ "setuid" : null,
1776+ "oom_score_adj" : 0,
1777+ "nice" : -21,
1778+ "debug" : 0,
1779+ "name" : "rsyslog"
1780+ },
1781+ {
1782+ "respawn" : 0,
1783+ "description" : "GNU Screen Cleanup",
1784+ "chdir" : null,
1785+ "process" : [
1786+ {
1787+ "command" : "SCREENDIR=/var/run/screen\nif [ -L $SCREENDIR ] || [ ! -d $SCREENDIR ]; then\n\trm -f $SCREENDIR\n\tmkdir $SCREENDIR\n\tchown root:utmp $SCREENDIR\nfi\nfind $SCREENDIR -type p -delete\n# If the local admin has used dpkg-statoverride to install the screen\n# binary with different set[ug]id bits, change the permissions of\n# $SCREENDIR accordingly\nBINARYPERM=`stat -c%a /usr/bin/screen`\nif [ \"$BINARYPERM\" -ge 4000 ]; then\n\tchmod 0755 $SCREENDIR\nelif [ \"$BINARYPERM\" -ge 2000 ]; then\n\tchmod 0775 $SCREENDIR\nelse\n\tchmod 0777 $SCREENDIR\nfi\n",
1788+ "script" : 1
1789+ },
1790+ {
1791+ "script" : 0,
1792+ "command" : null
1793+ },
1794+ {
1795+ "script" : 0,
1796+ "command" : null
1797+ },
1798+ {
1799+ "script" : 0,
1800+ "command" : null
1801+ },
1802+ {
1803+ "script" : 0,
1804+ "command" : null
1805+ },
1806+ {
1807+ "script" : 0,
1808+ "command" : null
1809+ },
1810+ {
1811+ "script" : 0,
1812+ "command" : null
1813+ }
1814+ ],
1815+ "expect" : "EXPECT_NONE",
1816+ "kill_timeout" : 5,
1817+ "apparmor_switch" : null,
1818+ "deleted" : 0,
1819+ "setgid" : null,
1820+ "author" : "Dustin Kirkland <kirkland@canonical.com>",
1821+ "usage" : null,
1822+ "chroot" : null,
1823+ "emits" : [],
1824+ "version" : null,
1825+ "umask" : 18,
1826+ "env" : [],
1827+ "export" : [],
1828+ "console" : "CONSOLE_LOG",
1829+ "start_on" : [
1830+ {
1831+ "value" : 0,
1832+ "name" : "filesystem",
1833+ "type" : "EVENT_MATCH"
1834+ }
1835+ ],
1836+ "limits" : [
1837+ {
1838+ "rlim_cur" : 0,
1839+ "rlim_max" : 0
1840+ },
1841+ {
1842+ "rlim_max" : 0,
1843+ "rlim_cur" : 0
1844+ },
1845+ {
1846+ "rlim_cur" : 0,
1847+ "rlim_max" : 0
1848+ },
1849+ {
1850+ "rlim_max" : 0,
1851+ "rlim_cur" : 0
1852+ },
1853+ {
1854+ "rlim_cur" : 0,
1855+ "rlim_max" : 0
1856+ },
1857+ {
1858+ "rlim_max" : 0,
1859+ "rlim_cur" : 0
1860+ },
1861+ {
1862+ "rlim_cur" : 0,
1863+ "rlim_max" : 0
1864+ },
1865+ {
1866+ "rlim_cur" : 0,
1867+ "rlim_max" : 0
1868+ },
1869+ {
1870+ "rlim_max" : 0,
1871+ "rlim_cur" : 0
1872+ },
1873+ {
1874+ "rlim_max" : 0,
1875+ "rlim_cur" : 0
1876+ },
1877+ {
1878+ "rlim_max" : 0,
1879+ "rlim_cur" : 0
1880+ },
1881+ {
1882+ "rlim_max" : 0,
1883+ "rlim_cur" : 0
1884+ },
1885+ {
1886+ "rlim_cur" : 0,
1887+ "rlim_max" : 0
1888+ },
1889+ {
1890+ "rlim_cur" : 0,
1891+ "rlim_max" : 0
1892+ },
1893+ {
1894+ "rlim_cur" : 0,
1895+ "rlim_max" : 0
1896+ },
1897+ {
1898+ "rlim_cur" : 0,
1899+ "rlim_max" : 0
1900+ }
1901+ ],
1902+ "instance" : "",
1903+ "path" : "/com/ubuntu/Upstart/jobs/screen_2dcleanup",
1904+ "respawn_interval" : 5,
1905+ "debug" : 0,
1906+ "name" : "screen-cleanup",
1907+ "oom_score_adj" : 0,
1908+ "nice" : -21,
1909+ "normalexit" : [],
1910+ "setuid" : null,
1911+ "respawn_limit" : 10,
1912+ "jobs" : [],
1913+ "session" : 0,
1914+ "reload_signal" : 1,
1915+ "kill_signal" : 15,
1916+ "task" : 1
1917+ },
1918+ {
1919+ "emits" : [],
1920+ "setgid" : null,
1921+ "deleted" : 0,
1922+ "author" : "Steve Langasek <steve.langasek@ubuntu.com>",
1923+ "usage" : null,
1924+ "chroot" : null,
1925+ "apparmor_switch" : null,
1926+ "chdir" : null,
1927+ "respawn" : 0,
1928+ "description" : "startpar bridge for notification of upstart job start/stop",
1929+ "process" : [
1930+ {
1931+ "command" : "startpar-upstart-inject \"$JOB\" \"$INSTANCE\" \"$UPSTART_EVENTS\"",
1932+ "script" : 0
1933+ },
1934+ {
1935+ "command" : null,
1936+ "script" : 0
1937+ },
1938+ {
1939+ "command" : null,
1940+ "script" : 0
1941+ },
1942+ {
1943+ "command" : null,
1944+ "script" : 0
1945+ },
1946+ {
1947+ "command" : null,
1948+ "script" : 0
1949+ },
1950+ {
1951+ "command" : null,
1952+ "script" : 0
1953+ },
1954+ {
1955+ "command" : null,
1956+ "script" : 0
1957+ }
1958+ ],
1959+ "expect" : "EXPECT_NONE",
1960+ "kill_timeout" : 5,
1961+ "jobs" : [],
1962+ "respawn_limit" : 10,
1963+ "session" : 0,
1964+ "reload_signal" : 1,
1965+ "kill_signal" : 15,
1966+ "task" : 1,
1967+ "name" : "startpar-bridge",
1968+ "debug" : 0,
1969+ "nice" : -21,
1970+ "oom_score_adj" : 0,
1971+ "normalexit" : [],
1972+ "setuid" : null,
1973+ "export" : [],
1974+ "console" : "CONSOLE_LOG",
1975+ "path" : "/com/ubuntu/Upstart/jobs/startpar_2dbridge",
1976+ "instance" : "$JOB-$INSTANCE-$UPSTART_EVENTS",
1977+ "limits" : [
1978+ {
1979+ "rlim_cur" : 0,
1980+ "rlim_max" : 0
1981+ },
1982+ {
1983+ "rlim_cur" : 0,
1984+ "rlim_max" : 0
1985+ },
1986+ {
1987+ "rlim_max" : 0,
1988+ "rlim_cur" : 0
1989+ },
1990+ {
1991+ "rlim_max" : 0,
1992+ "rlim_cur" : 0
1993+ },
1994+ {
1995+ "rlim_cur" : 0,
1996+ "rlim_max" : 0
1997+ },
1998+ {
1999+ "rlim_cur" : 0,
2000+ "rlim_max" : 0
2001+ },
2002+ {
2003+ "rlim_cur" : 0,
2004+ "rlim_max" : 0
2005+ },
2006+ {
2007+ "rlim_cur" : 0,
2008+ "rlim_max" : 0
2009+ },
2010+ {
2011+ "rlim_cur" : 0,
2012+ "rlim_max" : 0
2013+ },
2014+ {
2015+ "rlim_cur" : 0,
2016+ "rlim_max" : 0
2017+ },
2018+ {
2019+ "rlim_cur" : 0,
2020+ "rlim_max" : 0
2021+ },
2022+ {
2023+ "rlim_cur" : 0,
2024+ "rlim_max" : 0
2025+ },
2026+ {
2027+ "rlim_max" : 0,
2028+ "rlim_cur" : 0
2029+ },
2030+ {
2031+ "rlim_cur" : 0,
2032+ "rlim_max" : 0
2033+ },
2034+ {
2035+ "rlim_cur" : 0,
2036+ "rlim_max" : 0
2037+ },
2038+ {
2039+ "rlim_cur" : 0,
2040+ "rlim_max" : 0
2041+ }
2042+ ],
2043+ "start_on" : [
2044+ {
2045+ "env" : [
2046+ "JOB!=startpar-bridge"
2047+ ],
2048+ "name" : "started",
2049+ "value" : 0,
2050+ "type" : "EVENT_MATCH"
2051+ },
2052+ {
2053+ "env" : [
2054+ "JOB!=startpar-bridge"
2055+ ],
2056+ "name" : "stopped",
2057+ "value" : 0,
2058+ "type" : "EVENT_MATCH"
2059+ },
2060+ {
2061+ "value" : 0,
2062+ "type" : "EVENT_OR"
2063+ }
2064+ ],
2065+ "respawn_interval" : 5,
2066+ "env" : [],
2067+ "umask" : 18,
2068+ "version" : null
2069+ },
2070+ {
2071+ "apparmor_switch" : null,
2072+ "process" : [
2073+ {
2074+ "script" : 0,
2075+ "command" : "/home/james/src/c/bin/test_daemon --daemon --debug --post-fork-child-wait-file /tmp/wait"
2076+ },
2077+ {
2078+ "script" : 0,
2079+ "command" : null
2080+ },
2081+ {
2082+ "command" : null,
2083+ "script" : 0
2084+ },
2085+ {
2086+ "command" : null,
2087+ "script" : 0
2088+ },
2089+ {
2090+ "script" : 0,
2091+ "command" : null
2092+ },
2093+ {
2094+ "script" : 0,
2095+ "command" : null
2096+ },
2097+ {
2098+ "command" : null,
2099+ "script" : 0
2100+ }
2101+ ],
2102+ "description" : null,
2103+ "chdir" : null,
2104+ "respawn" : 0,
2105+ "kill_timeout" : 5,
2106+ "expect" : "EXPECT_DAEMON",
2107+ "emits" : [],
2108+ "setgid" : null,
2109+ "deleted" : 0,
2110+ "usage" : null,
2111+ "author" : null,
2112+ "chroot" : null,
2113+ "console" : "CONSOLE_LOG",
2114+ "export" : [],
2115+ "respawn_interval" : 5,
2116+ "limits" : [
2117+ {
2118+ "rlim_max" : 0,
2119+ "rlim_cur" : 0
2120+ },
2121+ {
2122+ "rlim_max" : 0,
2123+ "rlim_cur" : 0
2124+ },
2125+ {
2126+ "rlim_cur" : 0,
2127+ "rlim_max" : 0
2128+ },
2129+ {
2130+ "rlim_cur" : 0,
2131+ "rlim_max" : 0
2132+ },
2133+ {
2134+ "rlim_cur" : 0,
2135+ "rlim_max" : 0
2136+ },
2137+ {
2138+ "rlim_cur" : 0,
2139+ "rlim_max" : 0
2140+ },
2141+ {
2142+ "rlim_max" : 0,
2143+ "rlim_cur" : 0
2144+ },
2145+ {
2146+ "rlim_cur" : 0,
2147+ "rlim_max" : 0
2148+ },
2149+ {
2150+ "rlim_cur" : 0,
2151+ "rlim_max" : 0
2152+ },
2153+ {
2154+ "rlim_max" : 0,
2155+ "rlim_cur" : 0
2156+ },
2157+ {
2158+ "rlim_max" : 0,
2159+ "rlim_cur" : 0
2160+ },
2161+ {
2162+ "rlim_max" : 0,
2163+ "rlim_cur" : 0
2164+ },
2165+ {
2166+ "rlim_max" : 0,
2167+ "rlim_cur" : 0
2168+ },
2169+ {
2170+ "rlim_max" : 0,
2171+ "rlim_cur" : 0
2172+ },
2173+ {
2174+ "rlim_cur" : 0,
2175+ "rlim_max" : 0
2176+ },
2177+ {
2178+ "rlim_max" : 0,
2179+ "rlim_cur" : 0
2180+ }
2181+ ],
2182+ "start_on" : [
2183+ {
2184+ "name" : "foo",
2185+ "value" : 0,
2186+ "type" : "EVENT_MATCH"
2187+ }
2188+ ],
2189+ "instance" : "",
2190+ "path" : "/com/ubuntu/Upstart/jobs/test_2ddaemon_2d2",
2191+ "version" : null,
2192+ "env" : [],
2193+ "umask" : 18,
2194+ "respawn_limit" : 10,
2195+ "jobs" : [
2196+ {
2197+ "fds" : [],
2198+ "env" : [
2199+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
2200+ "TERM=linux",
2201+ "UPSTART_EVENTS=foo"
2202+ ],
2203+ "blocking" : [
2204+ {
2205+ "data" : {
2206+ "index" : 3
2207+ },
2208+ "type" : "BLOCKED_EVENT"
2209+ }
2210+ ],
2211+ "respawn_count" : 0,
2212+ "respawn_time" : 0,
2213+ "path" : "/com/ubuntu/Upstart/jobs/test_2ddaemon_2d2/_",
2214+ "failed" : 0,
2215+ "stop_env" : [],
2216+ "failed_process" : "PROCESS_INVALID",
2217+ "log" : [
2218+ {
2219+ "uid" : 0,
2220+ "remote_closed" : 0,
2221+ "detached" : 0,
2222+ "path" : "/var/log/upstart/test-daemon-2.log",
2223+ "fd" : 9,
2224+ "open_errno" : 9,
2225+ "io_watch_fd" : 15
2226+ },
2227+ {
2228+ "path" : null
2229+ },
2230+ {
2231+ "path" : null
2232+ },
2233+ {
2234+ "path" : null
2235+ },
2236+ {
2237+ "path" : null
2238+ },
2239+ {
2240+ "path" : null
2241+ },
2242+ {
2243+ "path" : null
2244+ }
2245+ ],
2246+ "name" : "",
2247+ "exit_status" : 0,
2248+ "trace_forks" : 1,
2249+ "trace_state" : "TRACE_NORMAL",
2250+ "state" : "JOB_SPAWNED",
2251+ "pid" : [
2252+ 1910,
2253+ 0,
2254+ 0,
2255+ 0,
2256+ 0,
2257+ 0,
2258+ 0
2259+ ],
2260+ "kill_process" : "PROCESS_INVALID",
2261+ "start_env" : [],
2262+ "goal" : "JOB_START"
2263+ }
2264+ ],
2265+ "kill_signal" : 15,
2266+ "task" : 0,
2267+ "session" : 0,
2268+ "reload_signal" : 1,
2269+ "oom_score_adj" : 0,
2270+ "nice" : -21,
2271+ "debug" : 0,
2272+ "name" : "test-daemon-2",
2273+ "setuid" : null,
2274+ "normalexit" : []
2275+ },
2276+ {
2277+ "version" : null,
2278+ "umask" : 18,
2279+ "env" : [],
2280+ "respawn_interval" : 5,
2281+ "limits" : [
2282+ {
2283+ "rlim_cur" : 0,
2284+ "rlim_max" : 0
2285+ },
2286+ {
2287+ "rlim_cur" : 0,
2288+ "rlim_max" : 0
2289+ },
2290+ {
2291+ "rlim_cur" : 0,
2292+ "rlim_max" : 0
2293+ },
2294+ {
2295+ "rlim_cur" : 0,
2296+ "rlim_max" : 0
2297+ },
2298+ {
2299+ "rlim_max" : 0,
2300+ "rlim_cur" : 0
2301+ },
2302+ {
2303+ "rlim_max" : 0,
2304+ "rlim_cur" : 0
2305+ },
2306+ {
2307+ "rlim_cur" : 0,
2308+ "rlim_max" : 0
2309+ },
2310+ {
2311+ "rlim_max" : 0,
2312+ "rlim_cur" : 0
2313+ },
2314+ {
2315+ "rlim_max" : 0,
2316+ "rlim_cur" : 0
2317+ },
2318+ {
2319+ "rlim_cur" : 0,
2320+ "rlim_max" : 0
2321+ },
2322+ {
2323+ "rlim_max" : 0,
2324+ "rlim_cur" : 0
2325+ },
2326+ {
2327+ "rlim_cur" : 0,
2328+ "rlim_max" : 0
2329+ },
2330+ {
2331+ "rlim_max" : 0,
2332+ "rlim_cur" : 0
2333+ },
2334+ {
2335+ "rlim_max" : 0,
2336+ "rlim_cur" : 0
2337+ },
2338+ {
2339+ "rlim_cur" : 0,
2340+ "rlim_max" : 0
2341+ },
2342+ {
2343+ "rlim_cur" : 0,
2344+ "rlim_max" : 0
2345+ }
2346+ ],
2347+ "start_on" : [
2348+ {
2349+ "name" : "runlevel",
2350+ "value" : 0,
2351+ "type" : "EVENT_MATCH",
2352+ "env" : [
2353+ "[23]"
2354+ ]
2355+ },
2356+ {
2357+ "value" : 0,
2358+ "name" : "not-container",
2359+ "type" : "EVENT_MATCH"
2360+ },
2361+ {
2362+ "type" : "EVENT_MATCH",
2363+ "name" : "container",
2364+ "value" : 0,
2365+ "env" : [
2366+ "CONTAINER=lxc"
2367+ ]
2368+ },
2369+ {
2370+ "value" : 0,
2371+ "type" : "EVENT_OR"
2372+ },
2373+ {
2374+ "env" : [
2375+ "CONTAINER=lxc-libvirt"
2376+ ],
2377+ "type" : "EVENT_MATCH",
2378+ "value" : 0,
2379+ "name" : "container"
2380+ },
2381+ {
2382+ "type" : "EVENT_OR",
2383+ "value" : 0
2384+ },
2385+ {
2386+ "value" : 0,
2387+ "type" : "EVENT_AND"
2388+ }
2389+ ],
2390+ "instance" : "",
2391+ "path" : "/com/ubuntu/Upstart/jobs/tty4",
2392+ "console" : "CONSOLE_LOG",
2393+ "export" : [],
2394+ "setuid" : null,
2395+ "normalexit" : [],
2396+ "oom_score_adj" : 0,
2397+ "nice" : -21,
2398+ "debug" : 0,
2399+ "name" : "tty4",
2400+ "task" : 0,
2401+ "kill_signal" : 15,
2402+ "reload_signal" : 1,
2403+ "session" : 0,
2404+ "respawn_limit" : 10,
2405+ "jobs" : [
2406+ {
2407+ "respawn_count" : 0,
2408+ "respawn_time" : 0,
2409+ "failed" : 0,
2410+ "path" : "/com/ubuntu/Upstart/jobs/tty4/_",
2411+ "fds" : [],
2412+ "env" : [
2413+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
2414+ "TERM=linux",
2415+ "RUNLEVEL=2",
2416+ "PREVLEVEL=N",
2417+ "UPSTART_EVENTS=runlevel not-container"
2418+ ],
2419+ "stop_on" : [
2420+ {
2421+ "env" : [
2422+ "[!23]"
2423+ ],
2424+ "type" : "EVENT_MATCH",
2425+ "value" : 0,
2426+ "name" : "runlevel"
2427+ }
2428+ ],
2429+ "trace_forks" : 0,
2430+ "state" : "JOB_RUNNING",
2431+ "trace_state" : "TRACE_NONE",
2432+ "pid" : [
2433+ 984,
2434+ 0,
2435+ 0,
2436+ 0,
2437+ 0,
2438+ 0,
2439+ 0
2440+ ],
2441+ "kill_process" : "PROCESS_INVALID",
2442+ "start_env" : [],
2443+ "goal" : "JOB_START",
2444+ "log" : [
2445+ {
2446+ "path" : null
2447+ },
2448+ {
2449+ "path" : null
2450+ },
2451+ {
2452+ "path" : null
2453+ },
2454+ {
2455+ "path" : null
2456+ },
2457+ {
2458+ "path" : null
2459+ },
2460+ {
2461+ "path" : null
2462+ },
2463+ {
2464+ "path" : null
2465+ }
2466+ ],
2467+ "failed_process" : "PROCESS_INVALID",
2468+ "stop_env" : [],
2469+ "name" : "",
2470+ "exit_status" : 0
2471+ }
2472+ ],
2473+ "kill_timeout" : 5,
2474+ "expect" : "EXPECT_NONE",
2475+ "process" : [
2476+ {
2477+ "script" : 0,
2478+ "command" : "/sbin/getty -8 38400 tty4"
2479+ },
2480+ {
2481+ "script" : 0,
2482+ "command" : null
2483+ },
2484+ {
2485+ "command" : null,
2486+ "script" : 0
2487+ },
2488+ {
2489+ "command" : null,
2490+ "script" : 0
2491+ },
2492+ {
2493+ "command" : null,
2494+ "script" : 0
2495+ },
2496+ {
2497+ "command" : null,
2498+ "script" : 0
2499+ },
2500+ {
2501+ "script" : 0,
2502+ "command" : null
2503+ }
2504+ ],
2505+ "chdir" : null,
2506+ "description" : null,
2507+ "respawn" : 1,
2508+ "apparmor_switch" : null,
2509+ "author" : null,
2510+ "usage" : null,
2511+ "chroot" : null,
2512+ "deleted" : 0,
2513+ "setgid" : null,
2514+ "emits" : [],
2515+ "stop_on" : [
2516+ {
2517+ "value" : 0,
2518+ "name" : "runlevel",
2519+ "type" : "EVENT_MATCH",
2520+ "env" : [
2521+ "[!23]"
2522+ ]
2523+ }
2524+ ]
2525+ },
2526+ {
2527+ "apparmor_switch" : null,
2528+ "process" : [
2529+ {
2530+ "command" : "/lib/systemd/systemd-udevd --daemon",
2531+ "script" : 0
2532+ },
2533+ {
2534+ "command" : null,
2535+ "script" : 0
2536+ },
2537+ {
2538+ "script" : 0,
2539+ "command" : null
2540+ },
2541+ {
2542+ "script" : 0,
2543+ "command" : null
2544+ },
2545+ {
2546+ "command" : null,
2547+ "script" : 0
2548+ },
2549+ {
2550+ "script" : 0,
2551+ "command" : null
2552+ },
2553+ {
2554+ "command" : null,
2555+ "script" : 0
2556+ }
2557+ ],
2558+ "chdir" : null,
2559+ "description" : "device node and kernel event manager",
2560+ "respawn" : 1,
2561+ "kill_timeout" : 5,
2562+ "expect" : "EXPECT_FORK",
2563+ "stop_on" : [
2564+ {
2565+ "value" : 0,
2566+ "name" : "runlevel",
2567+ "type" : "EVENT_MATCH",
2568+ "env" : [
2569+ "[06]"
2570+ ]
2571+ }
2572+ ],
2573+ "emits" : [],
2574+ "setgid" : null,
2575+ "deleted" : 0,
2576+ "usage" : null,
2577+ "chroot" : null,
2578+ "author" : null,
2579+ "console" : "CONSOLE_LOG",
2580+ "export" : [],
2581+ "respawn_interval" : 5,
2582+ "path" : "/com/ubuntu/Upstart/jobs/udev",
2583+ "start_on" : [
2584+ {
2585+ "name" : "virtual-filesystems",
2586+ "value" : 0,
2587+ "type" : "EVENT_MATCH"
2588+ }
2589+ ],
2590+ "limits" : [
2591+ {
2592+ "rlim_max" : 0,
2593+ "rlim_cur" : 0
2594+ },
2595+ {
2596+ "rlim_cur" : 0,
2597+ "rlim_max" : 0
2598+ },
2599+ {
2600+ "rlim_cur" : 0,
2601+ "rlim_max" : 0
2602+ },
2603+ {
2604+ "rlim_cur" : 0,
2605+ "rlim_max" : 0
2606+ },
2607+ {
2608+ "rlim_cur" : 0,
2609+ "rlim_max" : 0
2610+ },
2611+ {
2612+ "rlim_max" : 0,
2613+ "rlim_cur" : 0
2614+ },
2615+ {
2616+ "rlim_max" : 0,
2617+ "rlim_cur" : 0
2618+ },
2619+ {
2620+ "rlim_cur" : 0,
2621+ "rlim_max" : 0
2622+ },
2623+ {
2624+ "rlim_cur" : 0,
2625+ "rlim_max" : 0
2626+ },
2627+ {
2628+ "rlim_max" : 0,
2629+ "rlim_cur" : 0
2630+ },
2631+ {
2632+ "rlim_cur" : 0,
2633+ "rlim_max" : 0
2634+ },
2635+ {
2636+ "rlim_cur" : 0,
2637+ "rlim_max" : 0
2638+ },
2639+ {
2640+ "rlim_max" : 0,
2641+ "rlim_cur" : 0
2642+ },
2643+ {
2644+ "rlim_cur" : 0,
2645+ "rlim_max" : 0
2646+ },
2647+ {
2648+ "rlim_cur" : 0,
2649+ "rlim_max" : 0
2650+ },
2651+ {
2652+ "rlim_max" : 0,
2653+ "rlim_cur" : 0
2654+ }
2655+ ],
2656+ "instance" : "",
2657+ "umask" : 18,
2658+ "env" : [],
2659+ "version" : null,
2660+ "jobs" : [
2661+ {
2662+ "failed" : 0,
2663+ "path" : "/com/ubuntu/Upstart/jobs/udev/_",
2664+ "respawn_count" : 0,
2665+ "respawn_time" : 0,
2666+ "env" : [
2667+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
2668+ "TERM=linux",
2669+ "UPSTART_EVENTS=virtual-filesystems"
2670+ ],
2671+ "fds" : [],
2672+ "goal" : "JOB_START",
2673+ "start_env" : [],
2674+ "kill_process" : "PROCESS_INVALID",
2675+ "pid" : [
2676+ 513,
2677+ 0,
2678+ 0,
2679+ 0,
2680+ 0,
2681+ 0,
2682+ 0
2683+ ],
2684+ "state" : "JOB_RUNNING",
2685+ "trace_state" : "TRACE_NONE",
2686+ "stop_on" : [
2687+ {
2688+ "name" : "runlevel",
2689+ "value" : 0,
2690+ "type" : "EVENT_MATCH",
2691+ "env" : [
2692+ "[06]"
2693+ ]
2694+ }
2695+ ],
2696+ "trace_forks" : 1,
2697+ "exit_status" : 0,
2698+ "name" : "",
2699+ "log" : [
2700+ {
2701+ "path" : null
2702+ },
2703+ {
2704+ "path" : null
2705+ },
2706+ {
2707+ "path" : null
2708+ },
2709+ {
2710+ "path" : null
2711+ },
2712+ {
2713+ "path" : null
2714+ },
2715+ {
2716+ "path" : null
2717+ },
2718+ {
2719+ "path" : null
2720+ }
2721+ ],
2722+ "failed_process" : "PROCESS_INVALID",
2723+ "stop_env" : []
2724+ }
2725+ ],
2726+ "respawn_limit" : 10,
2727+ "kill_signal" : 15,
2728+ "task" : 0,
2729+ "session" : 0,
2730+ "reload_signal" : 1,
2731+ "nice" : -21,
2732+ "oom_score_adj" : 0,
2733+ "name" : "udev",
2734+ "debug" : 0,
2735+ "normalexit" : [],
2736+ "setuid" : null
2737+ },
2738+ {
2739+ "jobs" : [
2740+ {
2741+ "respawn_count" : 0,
2742+ "respawn_time" : 0,
2743+ "failed" : 0,
2744+ "path" : "/com/ubuntu/Upstart/jobs/upstart_2dudev_2dbridge/_",
2745+ "fds" : [],
2746+ "env" : [
2747+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
2748+ "TERM=linux",
2749+ "JOB=udev",
2750+ "INSTANCE=",
2751+ "UPSTART_EVENTS=starting"
2752+ ],
2753+ "stop_on" : [
2754+ {
2755+ "type" : "EVENT_MATCH",
2756+ "name" : "stopped",
2757+ "value" : 0,
2758+ "env" : [
2759+ "udev"
2760+ ]
2761+ }
2762+ ],
2763+ "trace_forks" : 2,
2764+ "state" : "JOB_RUNNING",
2765+ "trace_state" : "TRACE_NONE",
2766+ "pid" : [
2767+ 507,
2768+ 0,
2769+ 0,
2770+ 0,
2771+ 0,
2772+ 0,
2773+ 0
2774+ ],
2775+ "kill_process" : "PROCESS_INVALID",
2776+ "start_env" : [],
2777+ "goal" : "JOB_START",
2778+ "log" : [
2779+ {
2780+ "path" : null
2781+ },
2782+ {
2783+ "path" : null
2784+ },
2785+ {
2786+ "path" : null
2787+ },
2788+ {
2789+ "path" : null
2790+ },
2791+ {
2792+ "path" : null
2793+ },
2794+ {
2795+ "path" : null
2796+ },
2797+ {
2798+ "path" : null
2799+ }
2800+ ],
2801+ "stop_env" : [],
2802+ "failed_process" : "PROCESS_INVALID",
2803+ "name" : "",
2804+ "exit_status" : 0
2805+ }
2806+ ],
2807+ "respawn_limit" : 10,
2808+ "kill_signal" : 15,
2809+ "task" : 0,
2810+ "session" : 0,
2811+ "reload_signal" : 1,
2812+ "oom_score_adj" : 0,
2813+ "nice" : -21,
2814+ "name" : "upstart-udev-bridge",
2815+ "debug" : 0,
2816+ "setuid" : null,
2817+ "normalexit" : [],
2818+ "console" : "CONSOLE_LOG",
2819+ "export" : [],
2820+ "respawn_interval" : 5,
2821+ "path" : "/com/ubuntu/Upstart/jobs/upstart_2dudev_2dbridge",
2822+ "start_on" : [
2823+ {
2824+ "env" : [
2825+ "udev"
2826+ ],
2827+ "value" : 0,
2828+ "name" : "starting",
2829+ "type" : "EVENT_MATCH"
2830+ }
2831+ ],
2832+ "limits" : [
2833+ {
2834+ "rlim_cur" : 0,
2835+ "rlim_max" : 0
2836+ },
2837+ {
2838+ "rlim_max" : 0,
2839+ "rlim_cur" : 0
2840+ },
2841+ {
2842+ "rlim_cur" : 0,
2843+ "rlim_max" : 0
2844+ },
2845+ {
2846+ "rlim_cur" : 0,
2847+ "rlim_max" : 0
2848+ },
2849+ {
2850+ "rlim_cur" : 0,
2851+ "rlim_max" : 0
2852+ },
2853+ {
2854+ "rlim_cur" : 0,
2855+ "rlim_max" : 0
2856+ },
2857+ {
2858+ "rlim_max" : 0,
2859+ "rlim_cur" : 0
2860+ },
2861+ {
2862+ "rlim_max" : 0,
2863+ "rlim_cur" : 0
2864+ },
2865+ {
2866+ "rlim_max" : 0,
2867+ "rlim_cur" : 0
2868+ },
2869+ {
2870+ "rlim_max" : 0,
2871+ "rlim_cur" : 0
2872+ },
2873+ {
2874+ "rlim_max" : 0,
2875+ "rlim_cur" : 0
2876+ },
2877+ {
2878+ "rlim_max" : 0,
2879+ "rlim_cur" : 0
2880+ },
2881+ {
2882+ "rlim_cur" : 0,
2883+ "rlim_max" : 0
2884+ },
2885+ {
2886+ "rlim_max" : 0,
2887+ "rlim_cur" : 0
2888+ },
2889+ {
2890+ "rlim_cur" : 0,
2891+ "rlim_max" : 0
2892+ },
2893+ {
2894+ "rlim_cur" : 0,
2895+ "rlim_max" : 0
2896+ }
2897+ ],
2898+ "instance" : "",
2899+ "env" : [],
2900+ "umask" : 18,
2901+ "version" : null,
2902+ "stop_on" : [
2903+ {
2904+ "type" : "EVENT_MATCH",
2905+ "name" : "stopped",
2906+ "value" : 0,
2907+ "env" : [
2908+ "udev"
2909+ ]
2910+ }
2911+ ],
2912+ "emits" : [
2913+ "*-device-added",
2914+ "*-device-removed",
2915+ "*-device-changed",
2916+ "*-device-online",
2917+ "*-device-offline"
2918+ ],
2919+ "setgid" : null,
2920+ "deleted" : 0,
2921+ "usage" : null,
2922+ "author" : null,
2923+ "chroot" : null,
2924+ "apparmor_switch" : null,
2925+ "process" : [
2926+ {
2927+ "command" : "upstart-udev-bridge --daemon",
2928+ "script" : 0
2929+ },
2930+ {
2931+ "script" : 0,
2932+ "command" : null
2933+ },
2934+ {
2935+ "command" : null,
2936+ "script" : 0
2937+ },
2938+ {
2939+ "command" : null,
2940+ "script" : 0
2941+ },
2942+ {
2943+ "script" : 0,
2944+ "command" : null
2945+ },
2946+ {
2947+ "script" : 0,
2948+ "command" : null
2949+ },
2950+ {
2951+ "script" : 0,
2952+ "command" : null
2953+ }
2954+ ],
2955+ "chdir" : null,
2956+ "respawn" : 1,
2957+ "description" : "Bridge udev events into upstart",
2958+ "kill_timeout" : 5,
2959+ "expect" : "EXPECT_DAEMON"
2960+ },
2961+ {
2962+ "version" : null,
2963+ "env" : [],
2964+ "umask" : 18,
2965+ "console" : "CONSOLE_LOG",
2966+ "export" : [],
2967+ "respawn_interval" : 5,
2968+ "instance" : "",
2969+ "limits" : [
2970+ {
2971+ "rlim_cur" : 0,
2972+ "rlim_max" : 0
2973+ },
2974+ {
2975+ "rlim_max" : 0,
2976+ "rlim_cur" : 0
2977+ },
2978+ {
2979+ "rlim_cur" : 0,
2980+ "rlim_max" : 0
2981+ },
2982+ {
2983+ "rlim_max" : 0,
2984+ "rlim_cur" : 0
2985+ },
2986+ {
2987+ "rlim_cur" : 0,
2988+ "rlim_max" : 0
2989+ },
2990+ {
2991+ "rlim_max" : 0,
2992+ "rlim_cur" : 0
2993+ },
2994+ {
2995+ "rlim_max" : 0,
2996+ "rlim_cur" : 0
2997+ },
2998+ {
2999+ "rlim_cur" : 0,
3000+ "rlim_max" : 0
3001+ },
3002+ {
3003+ "rlim_max" : 0,
3004+ "rlim_cur" : 0
3005+ },
3006+ {
3007+ "rlim_cur" : 0,
3008+ "rlim_max" : 0
3009+ },
3010+ {
3011+ "rlim_cur" : 0,
3012+ "rlim_max" : 0
3013+ },
3014+ {
3015+ "rlim_max" : 0,
3016+ "rlim_cur" : 0
3017+ },
3018+ {
3019+ "rlim_cur" : 0,
3020+ "rlim_max" : 0
3021+ },
3022+ {
3023+ "rlim_max" : 0,
3024+ "rlim_cur" : 0
3025+ },
3026+ {
3027+ "rlim_max" : 0,
3028+ "rlim_cur" : 0
3029+ },
3030+ {
3031+ "rlim_max" : 0,
3032+ "rlim_cur" : 0
3033+ }
3034+ ],
3035+ "start_on" : [
3036+ {
3037+ "env" : [
3038+ "DEVICE=[/UL]*",
3039+ "MOUNTPOINT=/?*"
3040+ ],
3041+ "type" : "EVENT_MATCH",
3042+ "name" : "mounted",
3043+ "value" : 0
3044+ }
3045+ ],
3046+ "path" : "/com/ubuntu/Upstart/jobs/ureadahead_2dother",
3047+ "oom_score_adj" : 0,
3048+ "nice" : -21,
3049+ "debug" : 0,
3050+ "name" : "ureadahead-other",
3051+ "setuid" : null,
3052+ "normalexit" : [
3053+ 0,
3054+ 4
3055+ ],
3056+ "respawn_limit" : 10,
3057+ "jobs" : [],
3058+ "task" : 0,
3059+ "kill_signal" : 15,
3060+ "session" : 0,
3061+ "reload_signal" : 1,
3062+ "process" : [
3063+ {
3064+ "command" : "/sbin/ureadahead --daemon $MOUNTPOINT",
3065+ "script" : 0
3066+ },
3067+ {
3068+ "script" : 0,
3069+ "command" : null
3070+ },
3071+ {
3072+ "command" : null,
3073+ "script" : 0
3074+ },
3075+ {
3076+ "script" : 0,
3077+ "command" : null
3078+ },
3079+ {
3080+ "command" : null,
3081+ "script" : 0
3082+ },
3083+ {
3084+ "script" : 0,
3085+ "command" : null
3086+ },
3087+ {
3088+ "script" : 0,
3089+ "command" : null
3090+ }
3091+ ],
3092+ "respawn" : 0,
3093+ "chdir" : null,
3094+ "description" : "Read required files in advance (for other mountpoints)",
3095+ "kill_timeout" : 5,
3096+ "expect" : "EXPECT_FORK",
3097+ "apparmor_switch" : null,
3098+ "deleted" : 0,
3099+ "setgid" : null,
3100+ "usage" : null,
3101+ "author" : null,
3102+ "chroot" : null,
3103+ "emits" : []
3104+ },
3105+ {
3106+ "process" : [
3107+ {
3108+ "command" : "whoopsie",
3109+ "script" : 0
3110+ },
3111+ {
3112+ "command" : " [ -x /usr/bin/ubiquity-dm ] && { stop; exit 0; }\n\n if ! grep report_crashes=true /etc/default/whoopsie -sqi; then\n stop; exit 0\n fi\n",
3113+ "script" : 1
3114+ },
3115+ {
3116+ "script" : 0,
3117+ "command" : null
3118+ },
3119+ {
3120+ "command" : null,
3121+ "script" : 0
3122+ },
3123+ {
3124+ "script" : 0,
3125+ "command" : null
3126+ },
3127+ {
3128+ "script" : 0,
3129+ "command" : null
3130+ },
3131+ {
3132+ "script" : 0,
3133+ "command" : null
3134+ }
3135+ ],
3136+ "description" : "crash report submission daemon",
3137+ "chdir" : null,
3138+ "respawn" : 1,
3139+ "kill_timeout" : 5,
3140+ "expect" : "EXPECT_FORK",
3141+ "apparmor_switch" : null,
3142+ "setgid" : null,
3143+ "deleted" : 0,
3144+ "author" : null,
3145+ "usage" : null,
3146+ "chroot" : null,
3147+ "stop_on" : [
3148+ {
3149+ "value" : 0,
3150+ "name" : "runlevel",
3151+ "type" : "EVENT_MATCH",
3152+ "env" : [
3153+ "[!2345]"
3154+ ]
3155+ }
3156+ ],
3157+ "emits" : [],
3158+ "env" : [
3159+ "CRASH_DB_URL=https://daisy.ubuntu.com"
3160+ ],
3161+ "umask" : 18,
3162+ "version" : null,
3163+ "console" : "CONSOLE_LOG",
3164+ "export" : [],
3165+ "respawn_interval" : 5,
3166+ "path" : "/com/ubuntu/Upstart/jobs/whoopsie",
3167+ "start_on" : [
3168+ {
3169+ "name" : "runlevel",
3170+ "value" : 0,
3171+ "type" : "EVENT_MATCH",
3172+ "env" : [
3173+ "[2345]"
3174+ ]
3175+ }
3176+ ],
3177+ "limits" : [
3178+ {
3179+ "rlim_max" : 0,
3180+ "rlim_cur" : 0
3181+ },
3182+ {
3183+ "rlim_cur" : 0,
3184+ "rlim_max" : 0
3185+ },
3186+ {
3187+ "rlim_cur" : 0,
3188+ "rlim_max" : 0
3189+ },
3190+ {
3191+ "rlim_cur" : 0,
3192+ "rlim_max" : 0
3193+ },
3194+ {
3195+ "rlim_cur" : 0,
3196+ "rlim_max" : 0
3197+ },
3198+ {
3199+ "rlim_cur" : 0,
3200+ "rlim_max" : 0
3201+ },
3202+ {
3203+ "rlim_max" : 0,
3204+ "rlim_cur" : 0
3205+ },
3206+ {
3207+ "rlim_max" : 0,
3208+ "rlim_cur" : 0
3209+ },
3210+ {
3211+ "rlim_max" : 0,
3212+ "rlim_cur" : 0
3213+ },
3214+ {
3215+ "rlim_max" : 0,
3216+ "rlim_cur" : 0
3217+ },
3218+ {
3219+ "rlim_max" : 0,
3220+ "rlim_cur" : 0
3221+ },
3222+ {
3223+ "rlim_cur" : 0,
3224+ "rlim_max" : 0
3225+ },
3226+ {
3227+ "rlim_max" : 0,
3228+ "rlim_cur" : 0
3229+ },
3230+ {
3231+ "rlim_cur" : 0,
3232+ "rlim_max" : 0
3233+ },
3234+ {
3235+ "rlim_max" : 0,
3236+ "rlim_cur" : 0
3237+ },
3238+ {
3239+ "rlim_cur" : 0,
3240+ "rlim_max" : 0
3241+ }
3242+ ],
3243+ "instance" : "",
3244+ "oom_score_adj" : 0,
3245+ "nice" : -21,
3246+ "name" : "whoopsie",
3247+ "debug" : 0,
3248+ "setuid" : null,
3249+ "normalexit" : [],
3250+ "jobs" : [
3251+ {
3252+ "exit_status" : 0,
3253+ "name" : "",
3254+ "failed_process" : "PROCESS_INVALID",
3255+ "stop_env" : [],
3256+ "log" : [
3257+ {
3258+ "path" : null
3259+ },
3260+ {
3261+ "path" : null
3262+ },
3263+ {
3264+ "path" : null
3265+ },
3266+ {
3267+ "path" : null
3268+ },
3269+ {
3270+ "path" : null
3271+ },
3272+ {
3273+ "path" : null
3274+ },
3275+ {
3276+ "path" : null
3277+ }
3278+ ],
3279+ "goal" : "JOB_START",
3280+ "start_env" : [],
3281+ "kill_process" : "PROCESS_INVALID",
3282+ "pid" : [
3283+ 1204,
3284+ 0,
3285+ 0,
3286+ 0,
3287+ 0,
3288+ 0,
3289+ 0
3290+ ],
3291+ "trace_state" : "TRACE_NONE",
3292+ "state" : "JOB_RUNNING",
3293+ "trace_forks" : 1,
3294+ "stop_on" : [
3295+ {
3296+ "type" : "EVENT_MATCH",
3297+ "value" : 0,
3298+ "name" : "runlevel",
3299+ "env" : [
3300+ "[!2345]"
3301+ ]
3302+ }
3303+ ],
3304+ "env" : [
3305+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
3306+ "TERM=linux",
3307+ "CRASH_DB_URL=https://daisy.ubuntu.com",
3308+ "RUNLEVEL=2",
3309+ "PREVLEVEL=N",
3310+ "UPSTART_EVENTS=runlevel"
3311+ ],
3312+ "fds" : [],
3313+ "path" : "/com/ubuntu/Upstart/jobs/whoopsie/_",
3314+ "failed" : 0,
3315+ "respawn_time" : 0,
3316+ "respawn_count" : 0
3317+ }
3318+ ],
3319+ "respawn_limit" : 10,
3320+ "task" : 0,
3321+ "kill_signal" : 15,
3322+ "session" : 0,
3323+ "reload_signal" : 1
3324+ },
3325+ {
3326+ "usage" : null,
3327+ "author" : null,
3328+ "chroot" : null,
3329+ "setgid" : null,
3330+ "deleted" : 0,
3331+ "emits" : [],
3332+ "stop_on" : [
3333+ {
3334+ "env" : [
3335+ "[!2345]"
3336+ ],
3337+ "name" : "runlevel",
3338+ "value" : 0,
3339+ "type" : "EVENT_MATCH"
3340+ }
3341+ ],
3342+ "kill_timeout" : 5,
3343+ "expect" : "EXPECT_NONE",
3344+ "process" : [
3345+ {
3346+ "command" : null,
3347+ "script" : 0
3348+ },
3349+ {
3350+ "command" : " . /etc/default/apport\n [ \"$enabled\" = \"1\" ] || [ \"$force_start\" = \"1\" ] || exit 0\n\n mkdir -p -m 1777 /var/crash\n\n # check for kernel crash dump, convert it to apport report\n if [ -e /var/crash/vmcore ] || [ -n \"`ls /var/crash | egrep ^[0-9]{12}$`\" ]\n then\n\t/usr/share/apport/kernel_crashdump || true\n fi\n\n # check for incomplete suspend/resume or hibernate\n if [ -e /var/lib/pm-utils/status ]\n then\n /usr/share/apport/apportcheckresume || true\n rm -f /var/lib/pm-utils/status\n rm -f /var/lib/pm-utils/resume-hang.log\n fi\n\n echo \"|/usr/share/apport/apport %p %s %c\" > /proc/sys/kernel/core_pattern\n echo 2 > /proc/sys/fs/suid_dumpable\n",
3351+ "script" : 1
3352+ },
3353+ {
3354+ "script" : 0,
3355+ "command" : null
3356+ },
3357+ {
3358+ "command" : null,
3359+ "script" : 0
3360+ },
3361+ {
3362+ "command" : " # Check for a hung resume. If we find one try and grab everything\n # we can to aid in its discovery\n if [ -e /var/lib/pm-utils/status ]\n then\n\tps -wwef > /var/lib/pm-utils/resume-hang.log\n fi\n\n if [ \"`dd if=/proc/sys/kernel/core_pattern count=1 bs=1 2>/dev/null`\" != \"|\" ]\n then\n\texit 1\n else\n\techo 0 > /proc/sys/fs/suid_dumpable\n\techo \"core\" > /proc/sys/kernel/core_pattern\n fi\n",
3363+ "script" : 1
3364+ },
3365+ {
3366+ "command" : null,
3367+ "script" : 0
3368+ },
3369+ {
3370+ "script" : 0,
3371+ "command" : null
3372+ }
3373+ ],
3374+ "respawn" : 0,
3375+ "chdir" : null,
3376+ "description" : "automatic crash report generation",
3377+ "apparmor_switch" : null,
3378+ "normalexit" : [],
3379+ "setuid" : null,
3380+ "nice" : -21,
3381+ "oom_score_adj" : 0,
3382+ "name" : "apport",
3383+ "debug" : 0,
3384+ "task" : 0,
3385+ "kill_signal" : 15,
3386+ "session" : 0,
3387+ "reload_signal" : 1,
3388+ "jobs" : [
3389+ {
3390+ "goal" : "JOB_START",
3391+ "kill_process" : "PROCESS_INVALID",
3392+ "start_env" : [],
3393+ "pid" : [
3394+ 0,
3395+ 0,
3396+ 0,
3397+ 0,
3398+ 0,
3399+ 0,
3400+ 0
3401+ ],
3402+ "state" : "JOB_RUNNING",
3403+ "trace_state" : "TRACE_NONE",
3404+ "stop_on" : [
3405+ {
3406+ "value" : 0,
3407+ "name" : "runlevel",
3408+ "type" : "EVENT_MATCH",
3409+ "env" : [
3410+ "[!2345]"
3411+ ]
3412+ }
3413+ ],
3414+ "trace_forks" : 0,
3415+ "exit_status" : 0,
3416+ "name" : "",
3417+ "log" : [
3418+ {
3419+ "path" : null
3420+ },
3421+ {
3422+ "path" : null
3423+ },
3424+ {
3425+ "path" : null
3426+ },
3427+ {
3428+ "path" : null
3429+ },
3430+ {
3431+ "path" : null
3432+ },
3433+ {
3434+ "path" : null
3435+ },
3436+ {
3437+ "path" : null
3438+ }
3439+ ],
3440+ "failed_process" : "PROCESS_INVALID",
3441+ "stop_env" : [],
3442+ "failed" : 0,
3443+ "path" : "/com/ubuntu/Upstart/jobs/apport/_",
3444+ "respawn_count" : 0,
3445+ "respawn_time" : 0,
3446+ "env" : [
3447+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
3448+ "TERM=linux",
3449+ "enabled=1",
3450+ "RUNLEVEL=2",
3451+ "PREVLEVEL=N",
3452+ "UPSTART_EVENTS=runlevel"
3453+ ],
3454+ "fds" : []
3455+ }
3456+ ],
3457+ "respawn_limit" : 10,
3458+ "umask" : 18,
3459+ "env" : [
3460+ "enabled=1"
3461+ ],
3462+ "version" : null,
3463+ "respawn_interval" : 5,
3464+ "path" : "/com/ubuntu/Upstart/jobs/apport",
3465+ "limits" : [
3466+ {
3467+ "rlim_max" : 0,
3468+ "rlim_cur" : 0
3469+ },
3470+ {
3471+ "rlim_max" : 0,
3472+ "rlim_cur" : 0
3473+ },
3474+ {
3475+ "rlim_max" : 0,
3476+ "rlim_cur" : 0
3477+ },
3478+ {
3479+ "rlim_cur" : 0,
3480+ "rlim_max" : 0
3481+ },
3482+ {
3483+ "rlim_cur" : 0,
3484+ "rlim_max" : 0
3485+ },
3486+ {
3487+ "rlim_max" : 0,
3488+ "rlim_cur" : 0
3489+ },
3490+ {
3491+ "rlim_max" : 0,
3492+ "rlim_cur" : 0
3493+ },
3494+ {
3495+ "rlim_max" : 0,
3496+ "rlim_cur" : 0
3497+ },
3498+ {
3499+ "rlim_cur" : 0,
3500+ "rlim_max" : 0
3501+ },
3502+ {
3503+ "rlim_cur" : 0,
3504+ "rlim_max" : 0
3505+ },
3506+ {
3507+ "rlim_max" : 0,
3508+ "rlim_cur" : 0
3509+ },
3510+ {
3511+ "rlim_max" : 0,
3512+ "rlim_cur" : 0
3513+ },
3514+ {
3515+ "rlim_cur" : 0,
3516+ "rlim_max" : 0
3517+ },
3518+ {
3519+ "rlim_max" : 0,
3520+ "rlim_cur" : 0
3521+ },
3522+ {
3523+ "rlim_max" : 0,
3524+ "rlim_cur" : 0
3525+ },
3526+ {
3527+ "rlim_max" : 0,
3528+ "rlim_cur" : 0
3529+ }
3530+ ],
3531+ "instance" : "",
3532+ "start_on" : [
3533+ {
3534+ "env" : [
3535+ "[2345]"
3536+ ],
3537+ "name" : "runlevel",
3538+ "value" : 0,
3539+ "type" : "EVENT_MATCH"
3540+ }
3541+ ],
3542+ "console" : "CONSOLE_LOG",
3543+ "export" : []
3544+ },
3545+ {
3546+ "respawn" : 0,
3547+ "description" : "set console keymap",
3548+ "chdir" : null,
3549+ "process" : [
3550+ {
3551+ "command" : "loadkeys /etc/console-setup/cached.kmap.gz",
3552+ "script" : 0
3553+ },
3554+ {
3555+ "script" : 0,
3556+ "command" : null
3557+ },
3558+ {
3559+ "command" : null,
3560+ "script" : 0
3561+ },
3562+ {
3563+ "command" : null,
3564+ "script" : 0
3565+ },
3566+ {
3567+ "command" : null,
3568+ "script" : 0
3569+ },
3570+ {
3571+ "script" : 0,
3572+ "command" : null
3573+ },
3574+ {
3575+ "command" : null,
3576+ "script" : 0
3577+ }
3578+ ],
3579+ "expect" : "EXPECT_NONE",
3580+ "kill_timeout" : 5,
3581+ "apparmor_switch" : null,
3582+ "setgid" : null,
3583+ "deleted" : 0,
3584+ "usage" : null,
3585+ "author" : null,
3586+ "chroot" : null,
3587+ "emits" : [],
3588+ "env" : [],
3589+ "umask" : 18,
3590+ "version" : null,
3591+ "export" : [],
3592+ "console" : "CONSOLE_LOG",
3593+ "path" : "/com/ubuntu/Upstart/jobs/console_2dsetup",
3594+ "instance" : "",
3595+ "limits" : [
3596+ {
3597+ "rlim_max" : 0,
3598+ "rlim_cur" : 0
3599+ },
3600+ {
3601+ "rlim_max" : 0,
3602+ "rlim_cur" : 0
3603+ },
3604+ {
3605+ "rlim_max" : 0,
3606+ "rlim_cur" : 0
3607+ },
3608+ {
3609+ "rlim_max" : 0,
3610+ "rlim_cur" : 0
3611+ },
3612+ {
3613+ "rlim_max" : 0,
3614+ "rlim_cur" : 0
3615+ },
3616+ {
3617+ "rlim_max" : 0,
3618+ "rlim_cur" : 0
3619+ },
3620+ {
3621+ "rlim_max" : 0,
3622+ "rlim_cur" : 0
3623+ },
3624+ {
3625+ "rlim_max" : 0,
3626+ "rlim_cur" : 0
3627+ },
3628+ {
3629+ "rlim_cur" : 0,
3630+ "rlim_max" : 0
3631+ },
3632+ {
3633+ "rlim_cur" : 0,
3634+ "rlim_max" : 0
3635+ },
3636+ {
3637+ "rlim_cur" : 0,
3638+ "rlim_max" : 0
3639+ },
3640+ {
3641+ "rlim_max" : 0,
3642+ "rlim_cur" : 0
3643+ },
3644+ {
3645+ "rlim_cur" : 0,
3646+ "rlim_max" : 0
3647+ },
3648+ {
3649+ "rlim_cur" : 0,
3650+ "rlim_max" : 0
3651+ },
3652+ {
3653+ "rlim_cur" : 0,
3654+ "rlim_max" : 0
3655+ },
3656+ {
3657+ "rlim_cur" : 0,
3658+ "rlim_max" : 0
3659+ }
3660+ ],
3661+ "start_on" : [
3662+ {
3663+ "value" : 0,
3664+ "name" : "virtual-filesystems",
3665+ "type" : "EVENT_MATCH"
3666+ },
3667+ {
3668+ "value" : 0,
3669+ "name" : "starting",
3670+ "type" : "EVENT_MATCH",
3671+ "env" : [
3672+ "rcS"
3673+ ]
3674+ },
3675+ {
3676+ "value" : 0,
3677+ "type" : "EVENT_OR"
3678+ },
3679+ {
3680+ "env" : [
3681+ "mountall-shell"
3682+ ],
3683+ "name" : "starting",
3684+ "value" : 0,
3685+ "type" : "EVENT_MATCH"
3686+ },
3687+ {
3688+ "type" : "EVENT_OR",
3689+ "value" : 0
3690+ }
3691+ ],
3692+ "respawn_interval" : 5,
3693+ "name" : "console-setup",
3694+ "debug" : 0,
3695+ "oom_score_adj" : 0,
3696+ "nice" : -21,
3697+ "normalexit" : [],
3698+ "setuid" : null,
3699+ "jobs" : [],
3700+ "respawn_limit" : 10,
3701+ "reload_signal" : 1,
3702+ "session" : 0,
3703+ "task" : 1,
3704+ "kill_signal" : 15
3705+ },
3706+ {
3707+ "setuid" : null,
3708+ "normalexit" : [],
3709+ "oom_score_adj" : 0,
3710+ "nice" : -21,
3711+ "debug" : 0,
3712+ "name" : "hwclock-save",
3713+ "kill_signal" : 15,
3714+ "task" : 1,
3715+ "reload_signal" : 1,
3716+ "session" : 0,
3717+ "respawn_limit" : 10,
3718+ "jobs" : [],
3719+ "version" : null,
3720+ "env" : [],
3721+ "umask" : 18,
3722+ "respawn_interval" : 5,
3723+ "instance" : "",
3724+ "limits" : [
3725+ {
3726+ "rlim_max" : 0,
3727+ "rlim_cur" : 0
3728+ },
3729+ {
3730+ "rlim_max" : 0,
3731+ "rlim_cur" : 0
3732+ },
3733+ {
3734+ "rlim_max" : 0,
3735+ "rlim_cur" : 0
3736+ },
3737+ {
3738+ "rlim_max" : 0,
3739+ "rlim_cur" : 0
3740+ },
3741+ {
3742+ "rlim_cur" : 0,
3743+ "rlim_max" : 0
3744+ },
3745+ {
3746+ "rlim_cur" : 0,
3747+ "rlim_max" : 0
3748+ },
3749+ {
3750+ "rlim_max" : 0,
3751+ "rlim_cur" : 0
3752+ },
3753+ {
3754+ "rlim_max" : 0,
3755+ "rlim_cur" : 0
3756+ },
3757+ {
3758+ "rlim_max" : 0,
3759+ "rlim_cur" : 0
3760+ },
3761+ {
3762+ "rlim_cur" : 0,
3763+ "rlim_max" : 0
3764+ },
3765+ {
3766+ "rlim_cur" : 0,
3767+ "rlim_max" : 0
3768+ },
3769+ {
3770+ "rlim_cur" : 0,
3771+ "rlim_max" : 0
3772+ },
3773+ {
3774+ "rlim_cur" : 0,
3775+ "rlim_max" : 0
3776+ },
3777+ {
3778+ "rlim_max" : 0,
3779+ "rlim_cur" : 0
3780+ },
3781+ {
3782+ "rlim_cur" : 0,
3783+ "rlim_max" : 0
3784+ },
3785+ {
3786+ "rlim_cur" : 0,
3787+ "rlim_max" : 0
3788+ }
3789+ ],
3790+ "start_on" : [
3791+ {
3792+ "env" : [
3793+ "[06]"
3794+ ],
3795+ "value" : 0,
3796+ "name" : "runlevel",
3797+ "type" : "EVENT_MATCH"
3798+ }
3799+ ],
3800+ "path" : "/com/ubuntu/Upstart/jobs/hwclock_2dsave",
3801+ "console" : "CONSOLE_LOG",
3802+ "export" : [],
3803+ "author" : null,
3804+ "usage" : null,
3805+ "chroot" : null,
3806+ "deleted" : 0,
3807+ "setgid" : null,
3808+ "emits" : [],
3809+ "kill_timeout" : 5,
3810+ "expect" : "EXPECT_NONE",
3811+ "process" : [
3812+ {
3813+ "command" : ". /etc/default/rcS\n[ \"$UTC\" = \"yes\" ] && tz=\"--utc\" || tz=\"--localtime\"\n[ \"$BADYEAR\" = \"yes\" ] && badyear=\"--badyear\"\nexec hwclock --rtc=/dev/rtc0 --systohc $tz --noadjfile $badyear\n",
3814+ "script" : 1
3815+ },
3816+ {
3817+ "command" : null,
3818+ "script" : 0
3819+ },
3820+ {
3821+ "command" : null,
3822+ "script" : 0
3823+ },
3824+ {
3825+ "command" : null,
3826+ "script" : 0
3827+ },
3828+ {
3829+ "script" : 0,
3830+ "command" : null
3831+ },
3832+ {
3833+ "command" : null,
3834+ "script" : 0
3835+ },
3836+ {
3837+ "script" : 0,
3838+ "command" : null
3839+ }
3840+ ],
3841+ "description" : "save system clock to hardware clock",
3842+ "chdir" : null,
3843+ "respawn" : 0,
3844+ "apparmor_switch" : null
3845+ },
3846+ {
3847+ "version" : null,
3848+ "umask" : 18,
3849+ "env" : [],
3850+ "respawn_interval" : 5,
3851+ "start_on" : [
3852+ {
3853+ "env" : [
3854+ "[2345]"
3855+ ],
3856+ "name" : "runlevel",
3857+ "value" : 0,
3858+ "type" : "EVENT_MATCH"
3859+ }
3860+ ],
3861+ "limits" : [
3862+ {
3863+ "rlim_cur" : 0,
3864+ "rlim_max" : 0
3865+ },
3866+ {
3867+ "rlim_cur" : 0,
3868+ "rlim_max" : 0
3869+ },
3870+ {
3871+ "rlim_max" : 0,
3872+ "rlim_cur" : 0
3873+ },
3874+ {
3875+ "rlim_cur" : 0,
3876+ "rlim_max" : 0
3877+ },
3878+ {
3879+ "rlim_cur" : 0,
3880+ "rlim_max" : 0
3881+ },
3882+ {
3883+ "rlim_max" : 0,
3884+ "rlim_cur" : 0
3885+ },
3886+ {
3887+ "rlim_cur" : 0,
3888+ "rlim_max" : 0
3889+ },
3890+ {
3891+ "rlim_max" : 0,
3892+ "rlim_cur" : 0
3893+ },
3894+ {
3895+ "rlim_cur" : 0,
3896+ "rlim_max" : 0
3897+ },
3898+ {
3899+ "rlim_max" : 0,
3900+ "rlim_cur" : 0
3901+ },
3902+ {
3903+ "rlim_cur" : 0,
3904+ "rlim_max" : 0
3905+ },
3906+ {
3907+ "rlim_max" : 0,
3908+ "rlim_cur" : 0
3909+ },
3910+ {
3911+ "rlim_cur" : 0,
3912+ "rlim_max" : 0
3913+ },
3914+ {
3915+ "rlim_cur" : 0,
3916+ "rlim_max" : 0
3917+ },
3918+ {
3919+ "rlim_max" : 0,
3920+ "rlim_cur" : 0
3921+ },
3922+ {
3923+ "rlim_cur" : 0,
3924+ "rlim_max" : 0
3925+ }
3926+ ],
3927+ "instance" : "",
3928+ "path" : "/com/ubuntu/Upstart/jobs/irqbalance",
3929+ "console" : "CONSOLE_LOG",
3930+ "export" : [],
3931+ "setuid" : null,
3932+ "normalexit" : [],
3933+ "nice" : -21,
3934+ "oom_score_adj" : 0,
3935+ "debug" : 0,
3936+ "name" : "irqbalance",
3937+ "task" : 0,
3938+ "kill_signal" : 15,
3939+ "session" : 0,
3940+ "reload_signal" : 1,
3941+ "respawn_limit" : 10,
3942+ "jobs" : [],
3943+ "kill_timeout" : 5,
3944+ "expect" : "EXPECT_FORK",
3945+ "process" : [
3946+ {
3947+ "command" : "\ttest -f /etc/default/irqbalance && . /etc/default/irqbalance\n\n\ttest \"$ENABLED\" != \"0\" || exit 0\n\n\tif test \"$ONESHOT\" != \"0\"; then\n\t\tDOPTIONS=\"--oneshot\"\n\tfi\n\n\texec /usr/sbin/irqbalance $DOPTIONS\n\n",
3948+ "script" : 1
3949+ },
3950+ {
3951+ "script" : 0,
3952+ "command" : null
3953+ },
3954+ {
3955+ "script" : 0,
3956+ "command" : null
3957+ },
3958+ {
3959+ "script" : 0,
3960+ "command" : null
3961+ },
3962+ {
3963+ "command" : null,
3964+ "script" : 0
3965+ },
3966+ {
3967+ "command" : null,
3968+ "script" : 0
3969+ },
3970+ {
3971+ "command" : null,
3972+ "script" : 0
3973+ }
3974+ ],
3975+ "respawn" : 0,
3976+ "description" : "CPU interrupts balancing daemon",
3977+ "chdir" : null,
3978+ "apparmor_switch" : null,
3979+ "usage" : null,
3980+ "author" : "Chuck Short <zulcss@ubuntu.com>",
3981+ "chroot" : null,
3982+ "setgid" : null,
3983+ "deleted" : 0,
3984+ "emits" : [],
3985+ "stop_on" : [
3986+ {
3987+ "type" : "EVENT_MATCH",
3988+ "name" : "runlevel",
3989+ "value" : 0,
3990+ "env" : [
3991+ "[!2345]"
3992+ ]
3993+ }
3994+ ]
3995+ },
3996+ {
3997+ "expect" : "EXPECT_NONE",
3998+ "kill_timeout" : 5,
3999+ "respawn" : 0,
4000+ "description" : "Flush boot log to disk",
4001+ "chdir" : null,
4002+ "process" : [
4003+ {
4004+ "command" : "/bin/plymouth update-root-fs --read-write",
4005+ "script" : 0
4006+ },
4007+ {
4008+ "script" : 0,
4009+ "command" : null
4010+ },
4011+ {
4012+ "script" : 0,
4013+ "command" : null
4014+ },
4015+ {
4016+ "command" : null,
4017+ "script" : 0
4018+ },
4019+ {
4020+ "command" : null,
4021+ "script" : 0
4022+ },
4023+ {
4024+ "command" : null,
4025+ "script" : 0
4026+ },
4027+ {
4028+ "script" : 0,
4029+ "command" : null
4030+ }
4031+ ],
4032+ "apparmor_switch" : null,
4033+ "usage" : null,
4034+ "author" : null,
4035+ "chroot" : null,
4036+ "deleted" : 0,
4037+ "setgid" : null,
4038+ "emits" : [],
4039+ "umask" : 18,
4040+ "env" : [],
4041+ "version" : null,
4042+ "path" : "/com/ubuntu/Upstart/jobs/plymouth_2dlog",
4043+ "limits" : [
4044+ {
4045+ "rlim_cur" : 0,
4046+ "rlim_max" : 0
4047+ },
4048+ {
4049+ "rlim_max" : 0,
4050+ "rlim_cur" : 0
4051+ },
4052+ {
4053+ "rlim_max" : 0,
4054+ "rlim_cur" : 0
4055+ },
4056+ {
4057+ "rlim_max" : 0,
4058+ "rlim_cur" : 0
4059+ },
4060+ {
4061+ "rlim_max" : 0,
4062+ "rlim_cur" : 0
4063+ },
4064+ {
4065+ "rlim_cur" : 0,
4066+ "rlim_max" : 0
4067+ },
4068+ {
4069+ "rlim_cur" : 0,
4070+ "rlim_max" : 0
4071+ },
4072+ {
4073+ "rlim_cur" : 0,
4074+ "rlim_max" : 0
4075+ },
4076+ {
4077+ "rlim_cur" : 0,
4078+ "rlim_max" : 0
4079+ },
4080+ {
4081+ "rlim_cur" : 0,
4082+ "rlim_max" : 0
4083+ },
4084+ {
4085+ "rlim_max" : 0,
4086+ "rlim_cur" : 0
4087+ },
4088+ {
4089+ "rlim_cur" : 0,
4090+ "rlim_max" : 0
4091+ },
4092+ {
4093+ "rlim_cur" : 0,
4094+ "rlim_max" : 0
4095+ },
4096+ {
4097+ "rlim_cur" : 0,
4098+ "rlim_max" : 0
4099+ },
4100+ {
4101+ "rlim_cur" : 0,
4102+ "rlim_max" : 0
4103+ },
4104+ {
4105+ "rlim_max" : 0,
4106+ "rlim_cur" : 0
4107+ }
4108+ ],
4109+ "instance" : "",
4110+ "start_on" : [
4111+ {
4112+ "value" : 0,
4113+ "name" : "filesystem",
4114+ "type" : "EVENT_MATCH"
4115+ }
4116+ ],
4117+ "respawn_interval" : 5,
4118+ "export" : [],
4119+ "console" : "CONSOLE_LOG",
4120+ "normalexit" : [],
4121+ "setuid" : null,
4122+ "name" : "plymouth-log",
4123+ "debug" : 0,
4124+ "oom_score_adj" : 0,
4125+ "nice" : -21,
4126+ "session" : 0,
4127+ "reload_signal" : 1,
4128+ "kill_signal" : 15,
4129+ "task" : 1,
4130+ "jobs" : [],
4131+ "respawn_limit" : 10
4132+ },
4133+ {
4134+ "respawn_limit" : 10,
4135+ "jobs" : [
4136+ {
4137+ "name" : "",
4138+ "log" : [
4139+ {
4140+ "path" : "/var/log/upstart/systemd-logind.log",
4141+ "detached" : 0,
4142+ "remote_closed" : 0,
4143+ "uid" : 0,
4144+ "io_watch_fd" : 16,
4145+ "open_errno" : 9,
4146+ "fd" : 11
4147+ },
4148+ {
4149+ "path" : null
4150+ },
4151+ {
4152+ "path" : null
4153+ },
4154+ {
4155+ "path" : null
4156+ },
4157+ {
4158+ "path" : null
4159+ },
4160+ {
4161+ "path" : null
4162+ },
4163+ {
4164+ "path" : null
4165+ }
4166+ ],
4167+ "failed_process" : "PROCESS_INVALID",
4168+ "stop_env" : [],
4169+ "exit_status" : 0,
4170+ "state" : "JOB_RUNNING",
4171+ "trace_state" : "TRACE_NONE",
4172+ "stop_on" : [
4173+ {
4174+ "env" : [
4175+ "dbus"
4176+ ],
4177+ "name" : "stopping",
4178+ "value" : 0,
4179+ "type" : "EVENT_MATCH"
4180+ }
4181+ ],
4182+ "trace_forks" : 0,
4183+ "goal" : "JOB_START",
4184+ "kill_process" : "PROCESS_INVALID",
4185+ "pid" : [
4186+ 667,
4187+ 0,
4188+ 0,
4189+ 0,
4190+ 0,
4191+ 0,
4192+ 0
4193+ ],
4194+ "start_env" : [],
4195+ "fds" : [],
4196+ "env" : [
4197+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
4198+ "TERM=linux",
4199+ "SYSTEMD_LOG_TARGET=syslog",
4200+ "JOB=dbus",
4201+ "INSTANCE=",
4202+ "UPSTART_EVENTS=started"
4203+ ],
4204+ "failed" : 0,
4205+ "path" : "/com/ubuntu/Upstart/jobs/systemd_2dlogind/_",
4206+ "respawn_count" : 0,
4207+ "respawn_time" : 0
4208+ }
4209+ ],
4210+ "task" : 0,
4211+ "kill_signal" : 15,
4212+ "session" : 0,
4213+ "reload_signal" : 1,
4214+ "oom_score_adj" : 0,
4215+ "nice" : -21,
4216+ "debug" : 0,
4217+ "name" : "systemd-logind",
4218+ "setuid" : null,
4219+ "normalexit" : [],
4220+ "console" : "CONSOLE_LOG",
4221+ "export" : [],
4222+ "respawn_interval" : 5,
4223+ "instance" : "",
4224+ "limits" : [
4225+ {
4226+ "rlim_max" : 0,
4227+ "rlim_cur" : 0
4228+ },
4229+ {
4230+ "rlim_cur" : 0,
4231+ "rlim_max" : 0
4232+ },
4233+ {
4234+ "rlim_cur" : 0,
4235+ "rlim_max" : 0
4236+ },
4237+ {
4238+ "rlim_cur" : 0,
4239+ "rlim_max" : 0
4240+ },
4241+ {
4242+ "rlim_max" : 0,
4243+ "rlim_cur" : 0
4244+ },
4245+ {
4246+ "rlim_max" : 0,
4247+ "rlim_cur" : 0
4248+ },
4249+ {
4250+ "rlim_max" : 0,
4251+ "rlim_cur" : 0
4252+ },
4253+ {
4254+ "rlim_cur" : 16384,
4255+ "rlim_max" : 16384
4256+ },
4257+ {
4258+ "rlim_max" : 0,
4259+ "rlim_cur" : 0
4260+ },
4261+ {
4262+ "rlim_cur" : 0,
4263+ "rlim_max" : 0
4264+ },
4265+ {
4266+ "rlim_cur" : 0,
4267+ "rlim_max" : 0
4268+ },
4269+ {
4270+ "rlim_cur" : 0,
4271+ "rlim_max" : 0
4272+ },
4273+ {
4274+ "rlim_cur" : 0,
4275+ "rlim_max" : 0
4276+ },
4277+ {
4278+ "rlim_max" : 0,
4279+ "rlim_cur" : 0
4280+ },
4281+ {
4282+ "rlim_cur" : 0,
4283+ "rlim_max" : 0
4284+ },
4285+ {
4286+ "rlim_cur" : 0,
4287+ "rlim_max" : 0
4288+ }
4289+ ],
4290+ "start_on" : [
4291+ {
4292+ "env" : [
4293+ "dbus"
4294+ ],
4295+ "value" : 0,
4296+ "name" : "started",
4297+ "type" : "EVENT_MATCH"
4298+ }
4299+ ],
4300+ "path" : "/com/ubuntu/Upstart/jobs/systemd_2dlogind",
4301+ "version" : null,
4302+ "env" : [
4303+ "SYSTEMD_LOG_TARGET=syslog"
4304+ ],
4305+ "umask" : 18,
4306+ "stop_on" : [
4307+ {
4308+ "env" : [
4309+ "dbus"
4310+ ],
4311+ "name" : "stopping",
4312+ "value" : 0,
4313+ "type" : "EVENT_MATCH"
4314+ }
4315+ ],
4316+ "emits" : [],
4317+ "setgid" : null,
4318+ "deleted" : 0,
4319+ "usage" : null,
4320+ "author" : null,
4321+ "chroot" : null,
4322+ "apparmor_switch" : null,
4323+ "process" : [
4324+ {
4325+ "command" : "/lib/systemd/systemd-logind",
4326+ "script" : 0
4327+ },
4328+ {
4329+ "command" : " # only start if PAM module is actually available, not if libpam-systemd is\n # removed but not purged\n [ -e /lib/*/security/pam_systemd.so ] || { stop; exit 0; }\n\n # this is being done by systemd or mountall usually, but not during\n # upgrades from earlier distro releases\n if ! mountpoint -q /sys/fs/cgroup; then\n mount -t tmpfs -o uid=0,gid=0,mode=0755,size=1024 none /sys/fs/cgroup\n fi\n mkdir -p /run/systemd\n if ! mountpoint -q /sys/fs/cgroup/systemd; then\n mkdir -p /sys/fs/cgroup/systemd\n mount -t cgroup -o nosuid,noexec,nodev,none,name=systemd systemd /sys/fs/cgroup/systemd\n fi\n",
4330+ "script" : 1
4331+ },
4332+ {
4333+ "command" : null,
4334+ "script" : 0
4335+ },
4336+ {
4337+ "script" : 0,
4338+ "command" : null
4339+ },
4340+ {
4341+ "script" : 0,
4342+ "command" : null
4343+ },
4344+ {
4345+ "command" : null,
4346+ "script" : 0
4347+ },
4348+ {
4349+ "script" : 0,
4350+ "command" : null
4351+ }
4352+ ],
4353+ "description" : "SystemD login management service",
4354+ "chdir" : null,
4355+ "respawn" : 1,
4356+ "kill_timeout" : 5,
4357+ "expect" : "EXPECT_NONE"
4358+ },
4359+ {
4360+ "apparmor_switch" : null,
4361+ "kill_timeout" : 5,
4362+ "expect" : "EXPECT_NONE",
4363+ "process" : [
4364+ {
4365+ "script" : 0,
4366+ "command" : "/sbin/getty -8 38400 tty5"
4367+ },
4368+ {
4369+ "script" : 0,
4370+ "command" : null
4371+ },
4372+ {
4373+ "command" : null,
4374+ "script" : 0
4375+ },
4376+ {
4377+ "command" : null,
4378+ "script" : 0
4379+ },
4380+ {
4381+ "script" : 0,
4382+ "command" : null
4383+ },
4384+ {
4385+ "script" : 0,
4386+ "command" : null
4387+ },
4388+ {
4389+ "command" : null,
4390+ "script" : 0
4391+ }
4392+ ],
4393+ "chdir" : null,
4394+ "respawn" : 1,
4395+ "description" : null,
4396+ "emits" : [],
4397+ "stop_on" : [
4398+ {
4399+ "name" : "runlevel",
4400+ "value" : 0,
4401+ "type" : "EVENT_MATCH",
4402+ "env" : [
4403+ "[!23]"
4404+ ]
4405+ }
4406+ ],
4407+ "usage" : null,
4408+ "author" : null,
4409+ "chroot" : null,
4410+ "deleted" : 0,
4411+ "setgid" : null,
4412+ "respawn_interval" : 5,
4413+ "instance" : "",
4414+ "limits" : [
4415+ {
4416+ "rlim_cur" : 0,
4417+ "rlim_max" : 0
4418+ },
4419+ {
4420+ "rlim_cur" : 0,
4421+ "rlim_max" : 0
4422+ },
4423+ {
4424+ "rlim_cur" : 0,
4425+ "rlim_max" : 0
4426+ },
4427+ {
4428+ "rlim_max" : 0,
4429+ "rlim_cur" : 0
4430+ },
4431+ {
4432+ "rlim_max" : 0,
4433+ "rlim_cur" : 0
4434+ },
4435+ {
4436+ "rlim_max" : 0,
4437+ "rlim_cur" : 0
4438+ },
4439+ {
4440+ "rlim_max" : 0,
4441+ "rlim_cur" : 0
4442+ },
4443+ {
4444+ "rlim_max" : 0,
4445+ "rlim_cur" : 0
4446+ },
4447+ {
4448+ "rlim_max" : 0,
4449+ "rlim_cur" : 0
4450+ },
4451+ {
4452+ "rlim_max" : 0,
4453+ "rlim_cur" : 0
4454+ },
4455+ {
4456+ "rlim_cur" : 0,
4457+ "rlim_max" : 0
4458+ },
4459+ {
4460+ "rlim_max" : 0,
4461+ "rlim_cur" : 0
4462+ },
4463+ {
4464+ "rlim_cur" : 0,
4465+ "rlim_max" : 0
4466+ },
4467+ {
4468+ "rlim_cur" : 0,
4469+ "rlim_max" : 0
4470+ },
4471+ {
4472+ "rlim_cur" : 0,
4473+ "rlim_max" : 0
4474+ },
4475+ {
4476+ "rlim_cur" : 0,
4477+ "rlim_max" : 0
4478+ }
4479+ ],
4480+ "start_on" : [
4481+ {
4482+ "type" : "EVENT_MATCH",
4483+ "value" : 0,
4484+ "name" : "runlevel",
4485+ "env" : [
4486+ "[23]"
4487+ ]
4488+ },
4489+ {
4490+ "name" : "not-container",
4491+ "value" : 0,
4492+ "type" : "EVENT_MATCH"
4493+ },
4494+ {
4495+ "type" : "EVENT_AND",
4496+ "value" : 0
4497+ }
4498+ ],
4499+ "path" : "/com/ubuntu/Upstart/jobs/tty5",
4500+ "console" : "CONSOLE_LOG",
4501+ "export" : [],
4502+ "version" : null,
4503+ "env" : [],
4504+ "umask" : 18,
4505+ "task" : 0,
4506+ "kill_signal" : 15,
4507+ "session" : 0,
4508+ "reload_signal" : 1,
4509+ "respawn_limit" : 10,
4510+ "jobs" : [
4511+ {
4512+ "trace_forks" : 0,
4513+ "stop_on" : [
4514+ {
4515+ "value" : 0,
4516+ "name" : "runlevel",
4517+ "type" : "EVENT_MATCH",
4518+ "env" : [
4519+ "[!23]"
4520+ ]
4521+ }
4522+ ],
4523+ "trace_state" : "TRACE_NONE",
4524+ "state" : "JOB_RUNNING",
4525+ "kill_process" : "PROCESS_INVALID",
4526+ "pid" : [
4527+ 1010,
4528+ 0,
4529+ 0,
4530+ 0,
4531+ 0,
4532+ 0,
4533+ 0
4534+ ],
4535+ "start_env" : [],
4536+ "goal" : "JOB_START",
4537+ "failed_process" : "PROCESS_INVALID",
4538+ "stop_env" : [],
4539+ "log" : [
4540+ {
4541+ "path" : null
4542+ },
4543+ {
4544+ "path" : null
4545+ },
4546+ {
4547+ "path" : null
4548+ },
4549+ {
4550+ "path" : null
4551+ },
4552+ {
4553+ "path" : null
4554+ },
4555+ {
4556+ "path" : null
4557+ },
4558+ {
4559+ "path" : null
4560+ }
4561+ ],
4562+ "name" : "",
4563+ "exit_status" : 0,
4564+ "respawn_time" : 0,
4565+ "respawn_count" : 0,
4566+ "path" : "/com/ubuntu/Upstart/jobs/tty5/_",
4567+ "failed" : 0,
4568+ "fds" : [],
4569+ "env" : [
4570+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
4571+ "TERM=linux",
4572+ "RUNLEVEL=2",
4573+ "PREVLEVEL=N",
4574+ "UPSTART_EVENTS=runlevel not-container"
4575+ ]
4576+ }
4577+ ],
4578+ "normalexit" : [],
4579+ "setuid" : null,
4580+ "nice" : -21,
4581+ "oom_score_adj" : 0,
4582+ "debug" : 0,
4583+ "name" : "tty5"
4584+ },
4585+ {
4586+ "chroot" : null,
4587+ "usage" : null,
4588+ "author" : "Clint Byrum <clint@ubuntu.com>",
4589+ "setgid" : null,
4590+ "deleted" : 0,
4591+ "emits" : [
4592+ "failsafe-boot"
4593+ ],
4594+ "stop_on" : [
4595+ {
4596+ "type" : "EVENT_MATCH",
4597+ "name" : "static-network-up",
4598+ "value" : 0
4599+ },
4600+ {
4601+ "type" : "EVENT_MATCH",
4602+ "name" : "starting",
4603+ "value" : 0,
4604+ "env" : [
4605+ "rc-sysinit"
4606+ ]
4607+ },
4608+ {
4609+ "type" : "EVENT_OR",
4610+ "value" : 0
4611+ }
4612+ ],
4613+ "kill_timeout" : 5,
4614+ "expect" : "EXPECT_NONE",
4615+ "process" : [
4616+ {
4617+ "script" : 1,
4618+ "command" : "\t# Determine if plymouth is available\n\tif [ -x /bin/plymouth ] && /bin/plymouth --ping ; then\n\t\tPLYMOUTH=/bin/plymouth\n\telse\n\t\tPLYMOUTH=\":\"\n\tfi\n\n # The point here is to wait for 2 minutes before forcibly booting \n # the system. Anything that is in an \"or\" condition with 'started \n # failsafe' in rc-sysinit deserves consideration for mentioning in\n # these messages. currently only static-network-up counts for that.\n\n\tsleep 20\n\n # Plymouth errors should not stop the script because we *must* reach\n # the end of this script to avoid letting the system spin forever\n # waiting on it to start.\n\t$PLYMOUTH message --text=\"Waiting for network configuration...\" || :\n\tsleep 40\n\n\t$PLYMOUTH message --text=\"Waiting up to 60 more seconds for network configuration...\" || :\n\tsleep 59\n\t$PLYMOUTH message --text=\"Booting system without full network configuration...\" || :\n\n # give user 1 second to see this message since plymouth will go\n # away as soon as failsafe starts.\n\tsleep 1\n exec initctl emit --no-wait failsafe-boot\n"
4619+ },
4620+ {
4621+ "command" : null,
4622+ "script" : 0
4623+ },
4624+ {
4625+ "command" : "logger -t 'failsafe' -p daemon.warning \"Failsafe of 120 seconds reached.\"",
4626+ "script" : 0
4627+ },
4628+ {
4629+ "command" : null,
4630+ "script" : 0
4631+ },
4632+ {
4633+ "script" : 0,
4634+ "command" : null
4635+ },
4636+ {
4637+ "script" : 0,
4638+ "command" : null
4639+ },
4640+ {
4641+ "script" : 0,
4642+ "command" : null
4643+ }
4644+ ],
4645+ "respawn" : 0,
4646+ "description" : "Failsafe Boot Delay",
4647+ "chdir" : null,
4648+ "apparmor_switch" : null,
4649+ "setuid" : null,
4650+ "normalexit" : [],
4651+ "nice" : -21,
4652+ "oom_score_adj" : 0,
4653+ "name" : "failsafe",
4654+ "debug" : 0,
4655+ "kill_signal" : 15,
4656+ "task" : 0,
4657+ "reload_signal" : 1,
4658+ "session" : 0,
4659+ "jobs" : [
4660+ {
4661+ "failed" : 0,
4662+ "path" : "/com/ubuntu/Upstart/jobs/failsafe/_",
4663+ "respawn_count" : 0,
4664+ "respawn_time" : 0,
4665+ "env" : [
4666+ "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin",
4667+ "TERM=linux",
4668+ "IFACE=lo",
4669+ "LOGICAL=lo",
4670+ "ADDRFAM=inet",
4671+ "METHOD=loopback",
4672+ "UPSTART_EVENTS=filesystem net-device-up"
4673+ ],
4674+ "fds" : [],
4675+ "goal" : "JOB_START",
4676+ "pid" : [
4677+ 1213,
4678+ 0,
4679+ 0,
4680+ 0,
4681+ 0,
4682+ 0,
4683+ 0
4684+ ],
4685+ "kill_process" : "PROCESS_INVALID",
4686+ "start_env" : [],
4687+ "state" : "JOB_RUNNING",
4688+ "trace_state" : "TRACE_NONE",
4689+ "stop_on" : [
4690+ {
4691+ "value" : 0,
4692+ "name" : "static-network-up",
4693+ "type" : "EVENT_MATCH"
4694+ },
4695+ {
4696+ "env" : [
4697+ "rc-sysinit"
4698+ ],
4699+ "type" : "EVENT_MATCH",
4700+ "value" : 0,
4701+ "name" : "starting"
4702+ },
4703+ {
4704+ "type" : "EVENT_OR",
4705+ "value" : 0
4706+ }
4707+ ],
4708+ "trace_forks" : 0,
4709+ "exit_status" : 0,
4710+ "name" : "",
4711+ "log" : [
4712+ {
4713+ "path" : null
4714+ },
4715+ {
4716+ "path" : null
4717+ },
4718+ {
4719+ "path" : null
4720+ },
4721+ {
4722+ "path" : null
4723+ },
4724+ {
4725+ "path" : null
4726+ },
4727+ {
4728+ "path" : null
4729+ },
4730+ {
4731+ "path" : null
4732+ }
4733+ ],
4734+ "failed_process" : "PROCESS_INVALID",
4735+ "stop_env" : []
4736+ }
4737+ ],
4738+ "respawn_limit" : 10,
4739+ "umask" : 18,
4740+ "env" : [],
4741+ "version" : null,
4742+ "respawn_interval" : 5,
4743+ "path" : "/com/ubuntu/Upstart/jobs/failsafe",
4744+ "instance" : "",
4745+ "limits" : [
4746+ {
4747+ "rlim_max" : 0,
4748+ "rlim_cur" : 0
4749+ },
4750+ {
4751+ "rlim_cur" : 0,
4752+ "rlim_max" : 0
4753+ },
4754+ {
4755+ "rlim_max" : 0,
4756+ "rlim_cur" : 0
4757+ },
4758+ {
4759+ "rlim_cur" : 0,
4760+ "rlim_max" : 0
4761+ },
4762+ {
4763+ "rlim_max" : 0,
4764+ "rlim_cur" : 0
4765+ },
4766+ {
4767+ "rlim_cur" : 0,
4768+ "rlim_max" : 0
4769+ },
4770+ {
4771+ "rlim_max" : 0,
4772+ "rlim_cur" : 0
4773+ },
4774+ {
4775+ "rlim_max" : 0,
4776+ "rlim_cur" : 0
4777+ },
4778+ {
4779+ "rlim_cur" : 0,
4780+ "rlim_max" : 0
4781+ },
4782+ {
4783+ "rlim_max" : 0,
4784+ "rlim_cur" : 0
4785+ },
4786+ {
4787+ "rlim_max" : 0,
4788+ "rlim_cur" : 0
4789+ },
4790+ {
4791+ "rlim_max" : 0,
4792+ "rlim_cur" : 0
4793+ },
4794+ {
4795+ "rlim_max" : 0,
4796+ "rlim_cur" : 0
4797+ },
4798+ {
4799+ "rlim_max" : 0,
4800+ "rlim_cur" : 0
4801+ },
4802+ {
4803+ "rlim_cur" : 0,
4804+ "rlim_max" : 0
4805+ },
4806+ {
4807+ "rlim_cur" : 0,
4808+ "rlim_max" : 0
4809+ }
4810+ ],
4811+ "start_on" : [
4812+ {
4813+ "name" : "filesystem",
4814+ "value" : 0,
4815+ "type" : "EVENT_MATCH"
4816+ },
4817+ {
4818+ "name" : "net-device-up",
4819+ "value" : 0,
4820+ "type" : "EVENT_MATCH",
4821+ "env" : [
4822+ "IFACE=lo"
4823+ ]
4824+ },
4825+ {
4826+ "value" : 0,
4827+ "type" : "EVENT_AND"
4828+ }
4829+ ],
4830+ "console" : "CONSOLE_OUTPUT",
4831+ "export" : []
4832+ },
4833+ {
4834+ "respawn" : 0,
4835+ "chdir" : null,
4836+ "description" : null,
4837+ "process" : [
4838+ {
4839+ "command" : "hybrid-detect",
4840+ "script" : 0
4841+ },
4842+ {
4843+ "command" : null,
4844+ "script" : 0
4845+ },
4846+ {
4847+ "command" : null,
4848+ "script" : 0
4849+ },
4850+ {
4851+ "script" : 0,
4852+ "command" : null
4853+ },
4854+ {
4855+ "command" : null,
4856+ "script" : 0
4857+ },
4858+ {
4859+ "command" : null,
4860+ "script" : 0
4861+ },
4862+ {
4863+ "command" : null,
4864+ "script" : 0
4865+ }
4866+ ],
4867+ "expect" : "EXPECT_NONE",
4868+ "kill_timeout" : 5,
4869+ "apparmor_switch" : null,
4870+ "setgid" : null,
4871+ "deleted" : 0,
4872+ "chroot" : null,
4873+ "usage" : null,
4874+ "author" : null,
4875+ "emits" : [],
4876+ "env" : [],
4877+ "umask" : 18,
4878+ "version" : null,
4879+ "export" : [],
4880+ "console" : "CONSOLE_LOG",
4881+ "path" : "/com/ubuntu/Upstart/jobs/hybrid_2dgfx",
4882+ "start_on" : [
4883+ {
4884+ "type" : "EVENT_MATCH",
4885+ "name" : "starting",
4886+ "value" : 0,
4887+ "env" : [
4888+ "lightdm"
4889+ ]
4890+ },
4891+ {
4892+ "env" : [
4893+ "kdm"
4894+ ],
4895+ "name" : "starting",
4896+ "value" : 0,
4897+ "type" : "EVENT_MATCH"
4898+ },
4899+ {
4900+ "value" : 0,
4901+ "type" : "EVENT_OR"
4902+ },
4903+ {
4904+ "env" : [
4905+ "xdm"
4906+ ],
4907+ "type" : "EVENT_MATCH",
4908+ "name" : "starting",
4909+ "value" : 0
4910+ },
4911+ {
4912+ "type" : "EVENT_OR",
4913+ "value" : 0
4914+ },
4915+ {
4916+ "env" : [
4917+ "lxdm"
4918+ ],
4919+ "name" : "starting",
4920+ "value" : 0,
4921+ "type" : "EVENT_MATCH"
4922+ },
4923+ {
4924+ "type" : "EVENT_OR",
4925+ "value" : 0
4926+ }
4927+ ],
4928+ "limits" : [
4929+ {
4930+ "rlim_max" : 0,
4931+ "rlim_cur" : 0
4932+ },
4933+ {
4934+ "rlim_max" : 0,
4935+ "rlim_cur" : 0
4936+ },
4937+ {
4938+ "rlim_max" : 0,
4939+ "rlim_cur" : 0
4940+ },
4941+ {
4942+ "rlim_cur" : 0,
4943+ "rlim_max" : 0
4944+ },
4945+ {
4946+ "rlim_max" : 0,
4947+ "rlim_cur" : 0
4948+ },
4949+ {
4950+ "rlim_cur" : 0,
4951+ "rlim_max" : 0
4952+ },
4953+ {
4954+ "rlim_max" : 0,
4955+ "rlim_cur" : 0
4956+ },
4957+ {
4958+ "rlim_max" : 0,
4959+ "rlim_cur" : 0
4960+ },
4961+ {
4962+ "rlim_max" : 0,
4963+ "rlim_cur" : 0
4964+ },
4965+ {
4966+ "rlim_cur" : 0,
4967+ "rlim_max" : 0
4968+ },
4969+ {
4970+ "rlim_cur" : 0,
4971+ "rlim_max" : 0
4972+ },
4973+ {
4974+ "rlim_cur" : 0,
4975+ "rlim_max" : 0
4976+ },
4977+ {
4978+ "rlim_cur" : 0,
4979+ "rlim_max" : 0
4980+ },
4981+ {
4982+ "rlim_max" : 0,
4983+ "rlim_cur" : 0
4984+ },
4985+ {
4986+ "rlim_cur" : 0,
4987+ "rlim_max" : 0
4988+ },
4989+ {
4990+ "rlim_max" : 0,
4991+ "rlim_cur" : 0
4992+ }
4993+ ],
4994+ "instance" : "",
4995+ "respawn_interval" : 5,
4996+ "name" : "hybrid-gfx",
4997+ "debug" : 0,
4998+ "nice" : -21,
4999+ "oom_score_adj" : 0,
5000+ "setuid" : null,
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches