Usage: ${0##*/} [ARGS]
Do btrfs maintence or stop if xprintidle shows a user
-force Run regardless of user idle status on all disks.
+force Run regardless of user idle status on all disks and do scrub
+ regardless of when it was last run.
check Only check if an existing maintence should be cancelled due to
nonidle user. Also, runs in a loop every 20 seconds for 10
minutes.
fi
- tmp=$(mktemp)
fnd="findmnt --types btrfs --noheading"
for x in $($fnd --output "SOURCE" --nofsroot | sort -u); do
mnt=$($fnd --output "TARGET" --first-only --source $x)
# Only run for $check, since it runs in parallel to non-check, avoid
# race condition.
if $check; then
- if ! btrfs dev stats -c $mnt >$tmp; then
- if diff -q $mnt/btrfs-dev-stats $tmp; then
- diff -u $mnt/btrfs-dev-stats $tmp | mail -s "$HOSTNAME: error: btrfs dev stats -c $mnt" root@localhost
- cat $tmp >$mnt/btrfs-dev-stats
+ tmp=$(mktemp)
+ # if mnt is /, avoid making a buggy looking path
+ stats_path=${mnt%/}/btrfs-dev-stats
+ if [[ ! -e $stats_path ]]; then
+ btrfs dev stats -c $mnt >$stats_path ||: # populate initial reading
+ elif ! btrfs dev stats -c $mnt >$tmp; then
+ if ! diff -q $stats_path $tmp; then
+ exim -t <<EOF
+From: root@$HOSTNAME.b8.nz
+To: alerts@iankelling.org
+Subject: btrfsmaintstop: btrfs dev stats -c $mnt
+
+$(diff -u $stats_path $tmp ||:)
+EOF
+ mv $stats_path $stats_path.1
+ cat $tmp >$stats_path
fi
fi
rm -f $tmp
sed -rn 's/^\s*scrub started at (.*) and finished.*/\1/p'
)
fi
- if [[ $date ]]; then
+ if ! $force && [[ $date ]]; then
if $dryrun; then
echo "$0: last scrub finish for $mnt: $date"
fi
continue
fi
fi
- # -c 2 -n 4 is from btrfsmaintenance, does ionice
- e btrfs scrub start -Bd -c 2 -n 4 $mnt
+ # btrfsmaintenance does -c 2 -n 4, but I want lowest pri.
+ e btrfs scrub start -Bd -c 3 $mnt
# We normally only do one disk since this is meant to be run while I sleep
# and if we try to do all disks, we invariably end up doing a scrub still