プロセスを凍結して再開する方法

プロセスを凍結して再開する方法

~によるとこの問題そしてそれは答えを受け入れる、次のスクリプトは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"

関連情報