如何冻结和恢复进程

如何冻结和恢复进程

根据这个问题它接受的答案,以下脚本应暂停并恢复该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 的文件输出pauseresume

如果我们按原样使用脚本,输出文件大小会停止在合理的大小,当我们点击Enter按钮时,它会增长并停止在更高的合理大小;但它不会停止增长(我刚刚在+380MB后杀死了脚本)

如何停止(冻结)该过程然后继续?

答案1

一般来说(我不知道btrfs它在后台如何与执行大量磁盘 IO 的进程一起工作),人们可能会暂时停止 PID$pid

kill -TSTP "$pid"

然后可以恢复该过程

kill -CONT "$pid"

相关内容