2017-06-12 7 views
0

特定のプロセス(たとえばgit gc --aggressive)は、実行に時間がかかり、ディスク領域を大量に占有し、ディスク領域がなくなった場合に終了します。すぐに空き領域がなくなると一時停止したいので、メモリを解放する時間があります。これどうやってするの?ディスクがいっぱいになる前にプロセスを一時停止する

答えて

0

ここで私が思いついた初期の解決策です。 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 

あなたのdfに一致するようにDFを変更する必要があります。 (私のシステムではdf -hにエイリアスされているので、私はdfと直接電話しませんでした)

関連する問題