프로세스를 동결하고 재개하는 방법

프로세스를 동결하고 재개하는 방법

~에 따르면이 문제그리고그것은 대답을 받아들인다, 다음 스크립트는 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"

관련 정보