Como congelar e retomar um processo

0

De acordo com esta questão e sua resposta aceita , o seguinte script deve suspender e retomar o processo 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..."

No entanto, se recomendarmos pause a resume linhas no loop, esse processo leva 1,5 segundos e gera uma saída de arquivo de 244 MB.

Se usarmos o script como está, o tamanho do arquivo de saída será interrompido em um tamanho razoável, quando atingirmos o botão Enter , ele crescerá e será interrompido em um tamanho razoável mais alto; mas não vai parar de crescer (acabei de matar o script depois de + 380MB)

Como posso parar (congelar) o processo e depois continuar?

    
por ceremcem 01.05.2017 / 16:06

1 resposta

0

Em geral (eu não sei sobre btrfs ou como funciona sob o capô com um processo que faz quantidades extremas de disco IO) pode-se parar um processo cujo PID é $pid com

kill -STOP "$pid"

O processo pode então ser retomado com

kill -CONT "$pid"
    
por 01.05.2017 / 19:03