根据这个问题和它接受的答案,以下脚本应暂停并恢复该btrfs send
进程:
#!/bin/bash
get_ms () {
echo $(($(date +%s%N)/1000000))
}
START_TIME=$(get_ms)
echo "starting btrfs send to file"
btrfs send -p rootfs/rootfs.20170429T2001 rootfs/rootfs.20170430T0140 -f test.snapshot &
PID=$!
echo "PID is: $PID"
mkdir -p /sys/fs/cgroup/freezer/0
echo $PID > /sys/fs/cgroup/freezer/0/tasks
pause () {
echo "pausing process $PID"
echo FROZEN > /sys/fs/cgroup/freezer/0/freezer.state
}
resume () {
echo "resuming process $PID"
echo THAWED > /sys/fs/cgroup/freezer/0/freezer.state
}
is_alive () {
if [[ "$(ps -o pid= -p $PID)" == "$PID" ]]; then
return 0
else
return 1
fi
}
on_exit () {
kill -9 $PID
}
trap on_exit INT
while is_alive; do
echo "$PID is still alive..."
sleep 0.1
pause
read -p "Press [Enter] key to continue..."
resume
done
echo "Took $(($(get_ms) - $START_TIME)) ms..."
但是,如果我们在循环中推荐出行,则此过程需要 1.5 秒并生成 244MB 的文件输出pause
。resume
如果我们按原样使用脚本,输出文件大小会停止在合理的大小,当我们点击Enter
按钮时,它会增长并停止在更高的合理大小;但它不会停止增长(我刚刚在+380MB后杀死了脚本)
如何停止(冻结)该过程然后继续?
答案1
一般来说(我不知道btrfs
它在后台如何与执行大量磁盘 IO 的进程一起工作),人们可能会暂时停止 PID$pid
为
kill -TSTP "$pid"
然后可以恢复该过程
kill -CONT "$pid"