Я предлагаю использовать lsof
, чтобы определить, есть ли какие-либо запущенные процессы, и передать идентификаторы PID в pidstat
для анализа операций ввода-вывода. Оттуда мы узнаем, безопасно и желательно ли приостановить работу, в зависимости от того, обращаются ли какие-либо процессы к базовой файловой системе тома LUKS.
Это позволит вам уверенно планировать сценарий, не беспокоясь о повреждении или процессах, обрабатывающих приостановку неожиданным образом.
#!/bin/bash
if [ ! $1 ] ; then
echo "Usage: $0 device-path"
exit 1
fi
DEVICE=$1
# Collect PIDs that are running on LUKS filesystem
pids=$(lsof $DEVICE | tail -n+2 | awk '{ print $2 }')
SUSPEND=1
if [ "$pids" ] ; then
# Get the IO statistics of each process running from LUKS device
pidactivity=$(echo -E "$pids" | tr "\n" "," | xargs pidstat -d -p)
# Pull out only the IO fields of the pidstat response
pidio=$(echo -E "$pidactivity" | tail -n+4 | awk '{ print $5 " " $6 }')
# If there is IO going on for any of these PIDs, we should suspend
for io in "$pidio" ; do
for stat in $io ; do
if [ `echo "$stat > 0" | bc` -gt 0 ] ; then
SUSPEND=0
break 2
fi
done
done
fi
if [ $SUSPEND -eq 1 ] ; then
cryptsetup luksSuspend $DEVICE
fi