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