| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| description "Chrome OS user interface" |
| author "chromium-os-dev@chromium.org" |
| |
| # Note, the 'start on' line is modified by the chromeos-factoryinstall |
| # ebuild. Please do not change it without also changing that |
| # reference. |
| # |
| # This job's post-stop script depends on cryptohomed being running; |
| # cryptohomed in turn depends on chapsd and dbus-daemon. This job's |
| # stop condition uses a special stop job to keep those processes |
| # from terminating until after this job has cleaned up. See the |
| # pre-shutdown job for more details. |
| # NB: Respawning is now handled by ui-respawn.conf, as the logic is |
| # more complex than upstart was designed to handle. |
| start on started boot-services |
| stop on starting pre-shutdown |
| |
| # Enables chrome to renice background tabs (lower priority), and to set the |
| # priority of realtime threads to real time. |
| limit nice 20 20 |
| limit rtprio 10 10 |
| |
| # Extend the grace period given to the session_manager before upstart decides |
| # it's gone unresponsive on job termination and must be killed. Chrome gets 12s |
| # (configured below) to shut down on devices with HDDs, so give a cushion. |
| kill timeout 20 # In seconds. |
| |
| # Uncomment line below to output to VT02 |
| #console output |
| |
| # Directory where session manager logs are written and prefix of files there. |
| env UI_LOG_DIR=/var/log/ui |
| env UI_LOG_FILE=ui.LATEST |
| |
| pre-start script |
| mkdir -p $UI_LOG_DIR |
| ln -sf ui.$(date +%Y%m%d-%H%M%S) $UI_LOG_DIR/$UI_LOG_FILE |
| |
| # Set up cgroups for chrome. We create two task groups, one for at most one |
| # foreground renderer and one for all the background renderers and set the |
| # background group to a very low priority. We specifically do not set it to |
| # the lowest "2" such that other processes like the update-engine can be even |
| # lower. The default value is 1024. |
| CHROME_CPU_CGROUP_DIR=/sys/fs/cgroup/cpu/chrome_renderers |
| if [ ! -d $CHROME_CPU_CGROUP_DIR ]; then |
| mkdir -p ${CHROME_CPU_CGROUP_DIR}/foreground |
| mkdir -p ${CHROME_CPU_CGROUP_DIR}/background |
| echo "10" > ${CHROME_CPU_CGROUP_DIR}/background/cpu.shares |
| chown -R chronos ${CHROME_CPU_CGROUP_DIR} |
| fi |
| |
| # Set up the renderer freezer. This is used during the suspend/resume cycle |
| # to freeze all the chrome renderers so that they don't take up a lot of power |
| # when the system comes up in dark resume |
| CHROME_FREEZER_CGROUP_DIR=/sys/fs/cgroup/freezer/chrome_renderers |
| if [ ! -d $CHROME_FREEZER_CGROUP_DIR ]; then |
| mkdir -p ${CHROME_FREEZER_CGROUP_DIR} |
| mkdir -p "${CHROME_FREEZER_CGROUP_DIR}/to_be_frozen" |
| chown -R chronos ${CHROME_FREEZER_CGROUP_DIR} |
| fi |
| |
| # Set up the lucid sleep debug flag. This file only exists on devices that |
| # use kernel 3.14. When this sysfs entry is set to 1, the kernel will treat |
| # all resumes as dark resumes, relying on chrome and powerd to detect any user |
| # activity and to transition out of dark resume into regular resume. Since we |
| # are currently unable to distinguish the source that woke up the system, this |
| # is a temporary workaround to allow for apps and extensions to test lucid |
| # sleep functionality. Chrome will write 1 to this file only if the |
| # wake-on-packets flag is set. |
| # |
| # TODO(chirantan): Remove this once the firmware change and corresponding |
| # kernel change for querying the wakeup source is ready (crbug.com/414949). |
| DARK_RESUME_ALWAYS_FILE=/sys/power/dark_resume_always |
| if [ -e "${DARK_RESUME_ALWAYS_FILE}" ]; then |
| chown chronos "${DARK_RESUME_ALWAYS_FILE}" |
| fi |
| |
| end script # pre-start |
| |
| # This may be used to wrap the Chrome executable within another command |
| # instead of calling it directly. The flag's value will be split on whitespace |
| # into an absolute path and arguments, after which session_manager will add |
| # Chrome's arguments. For example: |
| # |
| # env CHROME_COMMAND_FLAG="--chrome-command=/usr/local/bin/strace /opt/google/chrome/chrome" |
| env CHROME_COMMAND_FLAG |
| |
| exec session_manager \ |
| "${CHROME_COMMAND_FLAG}" \ |
| >"${UI_LOG_DIR}/${UI_LOG_FILE}" 2>&1 |
| |
| post-stop script |
| bootstat ui-post-stop |
| set +e |
| . /sbin/killers |
| |
| # Terminate PKCS #11 services. |
| cryptohome --action=pkcs11_terminate |
| |
| # Terminate any processes with files open on the mount point |
| # TODO(wad) parallelize with VFS/PID namespaces. |
| kill_with_open_files_on /home/chronos/u-* |
| |
| # Make sure everything is going down. No exceptions. |
| # The loop is so that clever daemons can't evade the kill by |
| # racing us and killing us first; we'll just try over and over |
| # until we win the race, and kill with pid -1 is atomic with |
| # respect to process creation. |
| while ! sudo -u chronos kill -9 -- -1 ; do |
| sleep .1 |
| done |
| |
| # Check for still-living chronos processes and log their status. |
| ps -u chronos --no-headers -o pid,stat,args | |
| logger -i -t "${UPSTART_JOB}-unkillable" -p crit |
| |
| bootstat other-processes-terminated |
| |
| term_process '^X$' |
| bootstat x-terminated |
| |
| cryptohome --action=unmount |
| bootstat cryptohome-unmounted |
| end script |