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

Proposed by James Hunt
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 Needs Fixing
Review via email: mp+197080@code.launchpad.net
To post a comment you must log in.
Revision history for this message
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
Revision history for this message
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
Revision history for this message
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
1579. By Steve Langasek

Merge lp:~clint-fewbar/upstart/typo

1580. By James Hunt

* 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.

Revision history for this message
James Hunt (jamesodhunt) wrote :

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

Revision history for this message
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
1581. By James Hunt

* 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

* Sync with lp:upstart.

Revision history for this message
James Hunt (jamesodhunt) wrote :

Hi Steve,

Thanks for reviewing - code updated.

Unmerged revisions

1582. By James Hunt

* Sync with lp:upstart.

1581. By James Hunt

* 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

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

Subscribers

People subscribed via source and target branches