6 systemd-analyze log-level debug
7 systemd-analyze log-target console
9 unit
=testsuite-38-sleep.service
11 start_test_service
() {
12 systemctl daemon-reload
13 systemctl start
"${unit}"
20 local name
="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
21 local object_path
="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
24 org.freedesktop.systemd1 \
26 org.freedesktop.systemd1.Unit \
34 local name
="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
35 local object_path
="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
38 org.freedesktop.systemd1 \
40 org.freedesktop.systemd1.Unit \
46 org.freedesktop.systemd1 \
47 /org
/freedesktop
/systemd1 \
48 org.freedesktop.systemd1.Manager \
56 org.freedesktop.systemd1 \
57 /org
/freedesktop
/systemd1 \
58 org.freedesktop.systemd1.Manager \
68 local name
="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
69 local object_path
="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
72 org.freedesktop.systemd1 \
74 org.freedesktop.systemd1.Unit \
78 check_freezer_state
() {
82 local name
="$(echo ${1%.$suffix} | sed s/-/_2d/g)"
83 local object_path
="/org/freedesktop/systemd1/unit/${name}_2e${suffix}"
85 state
=$
(busctl get-property \
86 org.freedesktop.systemd1 \
88 org.freedesktop.systemd1.Unit \
89 FreezerState | cut
-d " " -f2 |
tr -d '"')
91 [ "$state" = "$2" ] ||
{
92 echo "error: unexpected freezer state, expected: $2, actual: $state" >&2
97 check_cgroup_state
() {
98 grep -q "frozen $2" /sys
/fs
/cgroup
/system.slice
/"$1"/cgroup.events
102 echo "Test that DBus API works:"
103 echo -n " - Freeze(): "
104 dbus_freeze
"${unit}"
105 check_freezer_state
"${unit}" "frozen"
106 check_cgroup_state
"$unit" 1
109 echo -n " - Thaw(): "
111 check_freezer_state
"${unit}" "running"
112 check_cgroup_state
"$unit" 0
115 echo -n " - FreezeUnit(): "
116 dbus_freeze_unit
"${unit}"
117 check_freezer_state
"${unit}" "frozen"
118 check_cgroup_state
"$unit" 1
121 echo -n " - ThawUnit(): "
122 dbus_thaw_unit
"${unit}"
123 check_freezer_state
"${unit}" "running"
124 check_cgroup_state
"$unit" 0
127 echo -n " - CanFreeze(): "
128 output
=$
(dbus_can_freeze
"${unit}")
129 [ "$output" = "b true" ]
138 echo "Test that it is possible to apply jobs on frozen units:"
140 systemctl start
"${unit}"
141 dbus_freeze
"${unit}"
142 check_freezer_state
"${unit}" "frozen"
144 echo -n " - restart: "
145 pid_before
=$
(systemctl show
-p MainPID
"${unit}" --value)
146 systemctl restart
"${unit}"
147 pid_after
=$
(systemctl show
-p MainPID
"${unit}" --value)
148 [ "$pid_before" != "$pid_after" ] && echo "[ OK ]"
150 dbus_freeze
"${unit}"
151 check_freezer_state
"${unit}" "frozen"
154 timeout
5s systemctl stop
"${unit}"
161 echo "Test that systemctl freeze/thaw verbs:"
163 systemctl start
"$unit"
165 echo -n " - freeze: "
166 systemctl freeze
"$unit"
167 check_freezer_state
"${unit}" "frozen"
168 check_cgroup_state
"$unit" 1
169 # Freezing already frozen unit should be NOP and return quickly
170 timeout
3s systemctl freeze
"$unit"
174 systemctl thaw
"$unit"
175 check_freezer_state
"${unit}" "running"
176 check_cgroup_state
"$unit" 0
177 # Likewise thawing already running unit shouldn't block
178 timeout
3s systemctl thaw
"$unit"
181 systemctl stop
"$unit"
186 test_systemctl_show
() {
187 echo "Test systemctl show integration:"
189 systemctl start
"$unit"
191 echo -n " - FreezerState property: "
192 state
=$
(systemctl show
-p FreezerState
--value "$unit")
193 [ "$state" = "running" ]
194 systemctl freeze
"$unit"
195 state
=$
(systemctl show
-p FreezerState
--value "$unit")
196 [ "$state" = "frozen" ]
197 systemctl thaw
"$unit"
200 echo -n " - CanFreeze property: "
201 state
=$
(systemctl show
-p CanFreeze
--value "$unit")
205 systemctl stop
"$unit"
210 local slice
="bar.slice"
211 local unit
="baz.service"
213 systemd-run
--unit "$unit" --slice "$slice" sleep 3600 >/dev
/null
2>&1
215 echo "Test recursive freezing:"
217 echo -n " - freeze: "
218 systemctl freeze
"$slice"
219 check_freezer_state
"${slice}" "frozen"
220 check_freezer_state
"${unit}" "frozen"
221 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
222 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
226 systemctl thaw
"$slice"
227 check_freezer_state
"${unit}" "running"
228 check_freezer_state
"${slice}" "running"
229 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
230 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
233 systemctl stop
"$unit"
234 systemctl stop
"$slice"
239 test_preserve_state
() {
240 local slice
="bar.slice"
241 local unit
="baz.service"
243 systemd-run
--unit "$unit" --slice "$slice" sleep 3600 >/dev
/null
2>&1
245 echo "Test that freezer state is preserved when recursive freezing is initiated from outside (e.g. by manager up the tree):"
247 echo -n " - freeze from outside: "
248 echo 1 > /sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
249 # Give kernel some time to freeze the slice
252 # Our state should not be affected
253 check_freezer_state
"${slice}" "running"
254 check_freezer_state
"${unit}" "running"
256 # However actual kernel state should be frozen
257 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
258 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
261 echo -n " - thaw from outside: "
262 echo 0 > /sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
265 check_freezer_state
"${unit}" "running"
266 check_freezer_state
"${slice}" "running"
267 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
268 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
271 echo -n " - thaw from outside while inner service is frozen: "
272 systemctl freeze
"$unit"
273 check_freezer_state
"${unit}" "frozen"
274 echo 1 > /sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
275 echo 0 > /sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
276 check_freezer_state
"${slice}" "running"
277 check_freezer_state
"${unit}" "frozen"
280 systemctl stop
"$unit"
281 systemctl stop
"$slice"
286 test -e /sys
/fs
/cgroup
/system.slice
/cgroup.freeze
&& {