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