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}"
17 local name object_path suffix
21 object_path
="/org/freedesktop/systemd1/unit/${name//-/_2d}_2e${suffix}"
24 org.freedesktop.systemd1 \
26 org.freedesktop.systemd1.Unit \
31 local name object_path suffix
35 object_path
="/org/freedesktop/systemd1/unit/${name//-/_2d}_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 \
65 local name object_path suffix
69 object_path
="/org/freedesktop/systemd1/unit/${name//-/_2d}_2e${suffix}"
72 org.freedesktop.systemd1 \
74 org.freedesktop.systemd1.Unit \
78 check_freezer_state
() {
79 local name object_path suffix
83 object_path
="/org/freedesktop/systemd1/unit/${name//-/_2d}_2e${suffix}"
86 state
=$
(busctl get-property \
87 org.freedesktop.systemd1 \
89 org.freedesktop.systemd1.Unit \
90 FreezerState | cut
-d " " -f2 |
tr -d '"')
92 # Ignore the intermediate freezing & thawing states in case we check
93 # the unit state too quickly
94 [[ "$state" =~ ^
(freezing|thawing
)$
]] ||
break
98 [ "$state" = "$2" ] ||
{
99 echo "error: unexpected freezer state, expected: $2, actual: $state" >&2
104 check_cgroup_state
() {
105 grep -q "frozen $2" /sys
/fs
/cgroup
/system.slice
/"$1"/cgroup.events
109 echo "Test that DBus API works:"
110 echo -n " - Freeze(): "
111 dbus_freeze
"${unit}"
112 check_freezer_state
"${unit}" "frozen"
113 check_cgroup_state
"$unit" 1
116 echo -n " - Thaw(): "
118 check_freezer_state
"${unit}" "running"
119 check_cgroup_state
"$unit" 0
122 echo -n " - FreezeUnit(): "
123 dbus_freeze_unit
"${unit}"
124 check_freezer_state
"${unit}" "frozen"
125 check_cgroup_state
"$unit" 1
128 echo -n " - ThawUnit(): "
129 dbus_thaw_unit
"${unit}"
130 check_freezer_state
"${unit}" "running"
131 check_cgroup_state
"$unit" 0
134 echo -n " - CanFreeze(): "
135 output
=$
(dbus_can_freeze
"${unit}")
136 [ "$output" = "b true" ]
145 echo "Test that it is possible to apply jobs on frozen units:"
147 systemctl start
"${unit}"
148 dbus_freeze
"${unit}"
149 check_freezer_state
"${unit}" "frozen"
151 echo -n " - restart: "
152 pid_before
=$
(systemctl show
-p MainPID
"${unit}" --value)
153 systemctl restart
"${unit}"
154 pid_after
=$
(systemctl show
-p MainPID
"${unit}" --value)
155 [ "$pid_before" != "$pid_after" ] && echo "[ OK ]"
157 dbus_freeze
"${unit}"
158 check_freezer_state
"${unit}" "frozen"
161 timeout
5s systemctl stop
"${unit}"
168 echo "Test that systemctl freeze/thaw verbs:"
170 systemctl start
"$unit"
172 echo -n " - freeze: "
173 systemctl freeze
"$unit"
174 check_freezer_state
"${unit}" "frozen"
175 check_cgroup_state
"$unit" 1
176 # Freezing already frozen unit should be NOP and return quickly
177 timeout
3s systemctl freeze
"$unit"
181 systemctl thaw
"$unit"
182 check_freezer_state
"${unit}" "running"
183 check_cgroup_state
"$unit" 0
184 # Likewise thawing already running unit shouldn't block
185 timeout
3s systemctl thaw
"$unit"
188 systemctl stop
"$unit"
193 test_systemctl_show
() {
194 echo "Test systemctl show integration:"
196 systemctl start
"$unit"
198 echo -n " - FreezerState property: "
199 state
=$
(systemctl show
-p FreezerState
--value "$unit")
200 [ "$state" = "running" ]
201 systemctl freeze
"$unit"
202 state
=$
(systemctl show
-p FreezerState
--value "$unit")
203 [ "$state" = "frozen" ]
204 systemctl thaw
"$unit"
207 echo -n " - CanFreeze property: "
208 state
=$
(systemctl show
-p CanFreeze
--value "$unit")
212 systemctl stop
"$unit"
217 local slice
="bar.slice"
218 local unit
="baz.service"
220 systemd-run
--unit "$unit" --slice "$slice" sleep 3600 >/dev
/null
2>&1
222 echo "Test recursive freezing:"
224 echo -n " - freeze: "
225 systemctl freeze
"$slice"
226 check_freezer_state
"${slice}" "frozen"
227 check_freezer_state
"${unit}" "frozen"
228 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
229 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
233 systemctl thaw
"$slice"
234 check_freezer_state
"${unit}" "running"
235 check_freezer_state
"${slice}" "running"
236 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
237 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
240 systemctl stop
"$unit"
241 systemctl stop
"$slice"
246 test_preserve_state
() {
247 local slice
="bar.slice"
248 local unit
="baz.service"
250 systemd-run
--unit "$unit" --slice "$slice" sleep 3600 >/dev
/null
2>&1
252 echo "Test that freezer state is preserved when recursive freezing is initiated from outside (e.g. by manager up the tree):"
254 echo -n " - freeze from outside: "
255 echo 1 >/sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
256 # Give kernel some time to freeze the slice
259 # Our state should not be affected
260 check_freezer_state
"${slice}" "running"
261 check_freezer_state
"${unit}" "running"
263 # However actual kernel state should be frozen
264 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
265 grep -q "frozen 1" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
268 echo -n " - thaw from outside: "
269 echo 0 >/sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
272 check_freezer_state
"${unit}" "running"
273 check_freezer_state
"${slice}" "running"
274 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/cgroup.events
275 grep -q "frozen 0" /sys
/fs
/cgroup
/"${slice}"/"${unit}"/cgroup.events
278 echo -n " - thaw from outside while inner service is frozen: "
279 systemctl freeze
"$unit"
280 check_freezer_state
"${unit}" "frozen"
281 echo 1 >/sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
282 echo 0 >/sys
/fs
/cgroup
/"${slice}"/cgroup.freeze
283 check_freezer_state
"${slice}" "running"
284 check_freezer_state
"${unit}" "frozen"
287 systemctl stop
"$unit"
288 systemctl stop
"$slice"
293 test -e /sys
/fs
/cgroup
/system.slice
/cgroup.freeze
&& {