[英]Pause a process before disk is full
Certain processes (like git gc --aggressive
) take a long time to run, take up lots of disk space, and die if I run out of disk space. 某些进程(如
git gc --aggressive
)需要很长时间才能运行,会占用大量磁盘空间,并且如果我用完磁盘空间就会死掉。 So I'd like to pause them if the disk will run out of space soon, so I have time to free up some memory. 因此,如果磁盘空间即将用尽,我想暂停它们,以便有时间释放一些内存。 How can I do this?
我怎样才能做到这一点?
Here is an initial solution I came up with. 这是我想出的一个初步解决方案。 Tested with Mac OS X. Suggestions welcome!
经过Mac OS X测试。欢迎提出建议!
#!/bin/bash
FILESYSTEM="/dev/disk1"
DF=/usr/local/opt/coreutils/libexec/gnubin/df
OSASCRIPT=/usr/bin/osascript
if ! [[ -x $DF ]]; then echo "Error: $DF isn't executable."; exit 1; fi
PID=$1
STOPAT=$2
# Verify input
if [[ -n ${PID//[0-9]/} ]]; then echo "Error: The first parameter should be an integer"; exit 1; fi
if [[ -n ${STOPAT//[0-9]/} ]]; then echo "Error: The second parameter should be an integer"; exit 1; fi
RED='\033[0;31m'; PURPLE='\033[0;35m'; BLUE='\033[0;36m'
NC='\033[0m' # No Color
echo -e "Will pause the following process when there are ${PURPLE}$STOPAT${NC} bytes left on ${PURPLE}$FILESYSTEM${NC}"
PROCESS=`ps -p $PID | grep $PID`
echo -e "${BLUE}$PROCESS${NC}"
# Check every second to see if FILESYSTEM has more than STOPAT bytes left.
while true; do
left=`$DF | grep -m 1 $FILESYSTEM | tr -s ' ' | cut -d" " -f4`
echo -ne "$left bytes left\r";
if [[ $left -lt $STOPAT ]]; then
MSG="pausing process...$PID";
echo $MSG;
if [[ -x $OSASCRIPT ]]; then
$OSASCRIPT -e "display notification \"$MSG\""
fi
kill -TSTP $PID
break
fi
sleep 1s
done
You'll need to change DF
to match your df
. 您需要更改
DF
以匹配df
。 (I didn't call df
directly because on my system that is aliased to df -h
.) (我没有直接调用
df
,因为在我的系统上别名为df -h
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.