dusage="5 10"
musage="5"
-e() { echo "cron: $*"; "$@"; }
+e() {
+ echo "cron: $*"
+ if ! $dryrun; then
+ "$@"
+ fi
+}
check-idle() {
type -p xprintidle &>/dev/null || return 0
usage() {
cat <<EOF
-Usage: ${0##*/} args
+Usage: ${0##*/} [ARGS]
Do btrfs maintence or stop if xprintidle shows a user
force Run regardless of user idle status
force=false
check=false
+dryrun=false
if [[ $1 ]]; then
case $1 in
check)
force)
force=true
;;
+ dryrun)
+ dryrun=true
+ ;;
*)
echo "$0: error: unexpected arg" >&2
usage 1
fi
if ! $idle; then
- btrfs scrub cancel $mnt &>/dev/null ||:
- continue
+ if $dryrun; then
+ echo "$0: not idle. if this wasnt a dry run, btrfs scrub cancel $mnt"
+ else
+ btrfs scrub cancel $mnt &>/dev/null ||:
+ continue
+ fi
fi
if $check; then
continue
e ionice -c 3 btrfs balance start -musage=$usage $mnt
done
fi
- # e btrfs filesystem df $mnt
- # e df -H $mnt
- date=$(
- btrfs scrub status $mnt | \
- sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p'
- )
+ date=
+ scrub_status=$(btrfs scrub status $mnt)
+ if printf "%s\n" "$scrub_status" | grep -i '^status:[[:space:]]*finished$' &>/dev/null; then
+ date=$(printf "%s\n" "$scrub_status" | sed -rn 's/^Scrub started:[[:space:]]*(.*)/\1/p')
+ fi
+ if [[ ! $date ]]; then
+ # output from older versions, at least btrfs v4.15.1
+ date=$(
+ printf "%s\n" "$scrub_status" | \
+ sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p'
+ )
+ fi
if [[ $date ]]; then
+ if $dryrun; then
+ echo "$0: last scrub finish for $mnt: $date"
+ fi
date=$(date --date="$date" +%s)
# if date is sooner than 90 days ago
# the wiki recommends 30 days or so, but
# it makes the comp lag like shit for a day,
# so I'm going with 90 days.
- if (( date > $(date +%s) - 60*60*24*30 )); then
- echo "cron: skiping scrub of $mnt"
+ if (( date > EPOCHSECONDS - 60*60*24*30 )); then
+ if $dryrun; then
+ echo "$0: skiping scrub of $mnt, last was $(( (EPOCHSECONDS - date) / 60/60/24 )) days ago, < 30 days"
+ fi
continue
fi
fi