* Provide two utility functions in Upstart jobs: "ensure JOBNAME"
starts the given job and waits until it's running; "stop_check" checks that the current job hasn't been asked to stop. svn path=/nixos/trunk/; revision=33214
This commit is contained in:
parent
07df536c42
commit
ee6c9bb998
|
@ -89,8 +89,8 @@ in
|
||||||
|
|
||||||
preStart =
|
preStart =
|
||||||
''
|
''
|
||||||
start portmap || true
|
ensure portmap
|
||||||
start mountd || true
|
ensure mountd
|
||||||
|
|
||||||
# Create a state directory required by NFSv4.
|
# Create a state directory required by NFSv4.
|
||||||
mkdir -p /var/lib/nfs/v4recovery
|
mkdir -p /var/lib/nfs/v4recovery
|
||||||
|
@ -104,7 +104,7 @@ in
|
||||||
|
|
||||||
postStart =
|
postStart =
|
||||||
''
|
''
|
||||||
start statd || true
|
ensure statd
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ in
|
||||||
|
|
||||||
preStart =
|
preStart =
|
||||||
''
|
''
|
||||||
start portmap || true
|
ensure portmap
|
||||||
|
|
||||||
mkdir -p /var/lib/nfs
|
mkdir -p /var/lib/nfs
|
||||||
touch /var/lib/nfs/rmtab
|
touch /var/lib/nfs/rmtab
|
||||||
|
|
|
@ -88,7 +88,7 @@ in
|
||||||
# Portmap forks into the background before it starts
|
# Portmap forks into the background before it starts
|
||||||
# listening, so wait until its ready.
|
# listening, so wait until its ready.
|
||||||
while ! nc -z localhost 111; do
|
while ! nc -z localhost 111; do
|
||||||
if [[ "$(status)" =~ stop/ ]]; then exit; fi
|
stop_check
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
'';
|
'';
|
||||||
|
|
|
@ -45,6 +45,7 @@ let
|
||||||
${optionalString (job.preStart != "") ''
|
${optionalString (job.preStart != "") ''
|
||||||
pre-start script
|
pre-start script
|
||||||
exec >> ${log} 2>&1
|
exec >> ${log} 2>&1
|
||||||
|
source ${jobHelpers}
|
||||||
${job.preStart}
|
${job.preStart}
|
||||||
end script
|
end script
|
||||||
''}
|
''}
|
||||||
|
@ -55,6 +56,7 @@ let
|
||||||
''
|
''
|
||||||
script
|
script
|
||||||
exec >> ${log} 2>&1
|
exec >> ${log} 2>&1
|
||||||
|
source ${jobHelpers}
|
||||||
${job.script}
|
${job.script}
|
||||||
end script
|
end script
|
||||||
''
|
''
|
||||||
|
@ -71,6 +73,7 @@ let
|
||||||
${optionalString (job.postStart != "") ''
|
${optionalString (job.postStart != "") ''
|
||||||
post-start script
|
post-start script
|
||||||
exec >> ${log} 2>&1
|
exec >> ${log} 2>&1
|
||||||
|
source ${jobHelpers}
|
||||||
${job.postStart}
|
${job.postStart}
|
||||||
end script
|
end script
|
||||||
''}
|
''}
|
||||||
|
@ -83,6 +86,7 @@ let
|
||||||
optionalString (job.preStop != "") (assert hasMain; ''
|
optionalString (job.preStop != "") (assert hasMain; ''
|
||||||
pre-stop script
|
pre-stop script
|
||||||
exec >> ${log} 2>&1
|
exec >> ${log} 2>&1
|
||||||
|
source ${jobHelpers}
|
||||||
${job.preStop}
|
${job.preStop}
|
||||||
end script
|
end script
|
||||||
'')}
|
'')}
|
||||||
|
@ -90,6 +94,7 @@ let
|
||||||
${optionalString (job.postStop != "") ''
|
${optionalString (job.postStop != "") ''
|
||||||
post-stop script
|
post-stop script
|
||||||
exec >> ${log} 2>&1
|
exec >> ${log} 2>&1
|
||||||
|
source ${jobHelpers}
|
||||||
${job.postStop}
|
${job.postStop}
|
||||||
end script
|
end script
|
||||||
''}
|
''}
|
||||||
|
@ -122,6 +127,46 @@ let
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
||||||
|
# Shell functions for use in Upstart jobs.
|
||||||
|
jobHelpers = pkgs.writeText "job-helpers.sh"
|
||||||
|
''
|
||||||
|
# Ensure that an Upstart service is running.
|
||||||
|
ensure() {
|
||||||
|
local job="$1"
|
||||||
|
local status="$(status "$job")"
|
||||||
|
|
||||||
|
# If it's already running, we're happy.
|
||||||
|
[[ "$status" =~ start/running ]] && return 0
|
||||||
|
|
||||||
|
# If its current goal is to stop, start it.
|
||||||
|
[[ "$status" =~ stop/ ]] && { status="$(start "$job")" || true; }
|
||||||
|
|
||||||
|
# The "start" command is synchronous *if* the job is
|
||||||
|
# not already starting. So if somebody else started
|
||||||
|
# the job in parallel, the "start" above may return
|
||||||
|
# while the job is still starting. So wait until it
|
||||||
|
# is up or has failed.
|
||||||
|
while true; do
|
||||||
|
[[ "$status" =~ stop/ ]] && { echo "job $job failed to start"; return 1; }
|
||||||
|
[[ "$status" =~ start/running ]] && return 0
|
||||||
|
echo "waiting for job $job to start..."
|
||||||
|
sleep 1
|
||||||
|
status="$(status "$job")"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check whether the current job has been stopped. Used in
|
||||||
|
# post-start jobs to determine if they should continue.
|
||||||
|
stop_check() {
|
||||||
|
if [[ "$(status)" =~ stop/ ]]; then
|
||||||
|
echo "job asked to stop!"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
|
||||||
jobOptions = {
|
jobOptions = {
|
||||||
|
|
||||||
name = mkOption {
|
name = mkOption {
|
||||||
|
|
|
@ -184,7 +184,7 @@ in
|
||||||
# ${fstab}
|
# ${fstab}
|
||||||
|
|
||||||
${optionalString config.services.nfs.client.enable ''
|
${optionalString config.services.nfs.client.enable ''
|
||||||
start statd || true
|
ensure statd || true
|
||||||
''}
|
''}
|
||||||
|
|
||||||
exec > /dev/console 2>&1
|
exec > /dev/console 2>&1
|
||||||
|
|
|
@ -49,7 +49,7 @@ in
|
||||||
|
|
||||||
preStart =
|
preStart =
|
||||||
''
|
''
|
||||||
start portmap || true
|
ensure portmap
|
||||||
mkdir -p /var/lib/nfs
|
mkdir -p /var/lib/nfs
|
||||||
mkdir -p /var/lib/nfs/sm
|
mkdir -p /var/lib/nfs/sm
|
||||||
mkdir -p /var/lib/nfs/sm.bak
|
mkdir -p /var/lib/nfs/sm.bak
|
||||||
|
|
Loading…
Reference in a new issue