1

Тема: SdUnIdle

Всем привет

Наконец то я решил проблему с автоотключением винта по определенному времени (у меня было 10 минут).

В общем как оказалось, достаточно прочитать смарт винта, это сбивало внутренний таймер винта. написал небольшлй скрипт, теперь на моем сервере винт крутится минимум час, а не колбасится туда-сюда каждые 15 минут

Идея такова, что в скрипте каждые 5 минут читается смарт, если не было обращений к диску. И так до тех пор, пока таймер разрешает

Сам скрипт:

#!/bin/sh

UNIDLE=3001
SLEEPTIME=300

ctimer=0
cline="";
ti=0
tu=0

while true; do
cat /proc/diskstats | grep "sda " > /var/log/unidle.log
    while read line; do
    if [ "$cline" != "$line" ]; then
        cline=$line
        ctimer=0        
        if [ "$ti" -gt "0" ]; then
            s=`printf "%d hours %d mins\n" $(($ti/60/60%60)) $(($ti/60%60))`
            logger "Clear UnIdle Timer. Timer $s"
            ti=0
        fi
        tu=$(($tu+$SLEEPTIME))
    else
        ctimer=$(($ctimer+$SLEEPTIME))
        if [ "$ctimer" -lt "$UNIDLE" ]; then
            s=`printf "%d hours %d mins\n" $(($ctimer/60/60%60)) $(($ctimer/60%60))`
            logger "Run UnIdle Commnad. Timer $s"
            smartctl -a -d sat,12 /dev/sda |grep ^194| awk '{print $10}' > /var/log/unidle1.log
            logger "Temperature /dev/sda: " `cat /var/log/unidle1.log` " celsius"
            tu=$(($tu+$SLEEPTIME))
        else
            ti=$(($ti+$SLEEPTIME))
            if [ "$tu" -gt "0" ]; then
                s=`printf "%d hours %d mins\n" $(($tu/60/60%60)) $(($tu/60%60))`
                logger "Stopping UnIdle. Timer $s"
                tu=0
            fi
        fi
    fi
    sleep $SLEEPTIME
    done < /var/log/unidle.log
done


2

Re: SdUnIdle

Nick N., можно периодически анализировать /sys/block/sda/sda1/stat - и если не было обращений к диску за последнее время - "дергать" диск.
Нечто подобное делает эта прога - http://www.sagaforce.com/~sound/wdantiparkd/ (WD anti-intellipark daemon).



3

Re: SdUnIdle

есть утилита, которая отключает парковку головок для wd green
официальная



4

Re: SdUnIdle

У меня сигейт. ничем не оключалось (точнее утилиты говорили что все ок, выключено), а винт все равно останавливался



5

Re: SdUnIdle

Уважаемые, такая же проблема с сигейтом фри агент 500гб, подскажите пожалуйста на  пальцах что надо следать с этим скриптом, что б хард не засыпал.



6

Re: SdUnIdle

Уважаемые гуру линукса, я понимаю что вас достали вопросы от нубов, но тем не менее, будьте добры помочь.
я скопировал листинг из 1 поста в файл с произвольным названием по маске S00***, положил это файл в init.d сделал ему chmod +x  но когда путаюсь его запустить ./S00***   то ничего не происходит и консоль как бы подвисает, не принимает никакие команды, помогает только перезапуск putty.
что я делаю не так и как надо правильно сделать?



7

Re: SdUnIdle

Файл init.d/S54sdunidle

#!/bin/sh

start() {
    sdunidle.sh 2>/dev/null & 
}

stop() {
    killall sdunidle.sh
    killall sdunidle
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 1
        start
        ;;
    link_up)
        ;;
    ppp_up)
        ;;
    link_down)
        ;;
    ppp_down)
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|link_up|link_down|ppp_up|ppp_down}"
        ;;
esac


8

Re: SdUnIdle

А предыдущий скрипт сохранить как /system/sbin/sdunidle.sh



9

Re: SdUnIdle

ashtro, для init.d нужно чуть иначе скрипты писать,  они должны понимать параметры start, stop, restart.
Попросите автора скрипта Nick N. сделать такой.

Приведенный скрипт выполняет бесконечный цикл. Поместите его в произвольную папку (например, в system/bin) и запустите с символом & в конце. Скрипт запустится в фоне.

Если все работает, сделайте еще один скрипт в init.d, который по команде start будет запускать первый (с символом &), а по команде stop - останавливать. Примеров таких скриптов много в разных пакетах.



10

Re: SdUnIdle

большое спасибо, буду ковыряться smile)

Отредактировано ashtroy (2011-10-23 12:06:02)



11

Re: SdUnIdle

ashtro пишет:

Nick N., т.е. скрип из 1 поста не нужен?  здорово, что вы все это делаете, это очень нужно, но пояснения совсем не помешают новичкам..

Как написал Zyxmon, первый скрипт это собственно отключение засыпания винта, второй - для зупска первого в системе Keenetic-a



12

Re: SdUnIdle

29510 root       1024 S   /bin/sh /media/DISK_A1/system/sbin/sdunidle.sh

видимо все получилось? smile)  ещё раз больше спасибо!



13

Re: SdUnIdle

Сегодня AndreyUA выложил образ системы с пакетом сборки под Keenetic. Потихоньку сделаю SdUnIdle по аналогии с SdIdle (точнее на основе нее)



14

Re: SdUnIdle

Nick N., sdunidle.sh можно попробовать заменить демоном, собирать как и sd-idle, что-то вида:

sd-unidle.c
---------------------------------------------------------------------------------------------------------------------------
/*
 * Заголовочные файлы добавил с избытком 
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <dirent.h>

int main(void) {

  pid_t pid, sid;

  pid = fork();

  if (pid < 0) {
    exit(EXIT_FAILURE);
  }

  if (pid > 0) {
    exit(EXIT_SUCCESS);
  }

  umask(0);

  sid = setsid();
  if (sid < 0) {
    exit(EXIT_FAILURE);
  }

  if ((chdir("/")) < 0) {
    exit(EXIT_FAILURE);
  }

  close(STDIN_FILENO);
  close(STDOUT_FILENO);
  close(STDERR_FILENO);

  openlog("sd-unidle", LOG_PERROR | LOG_PID, LOG_USER);
  syslog(LOG_INFO, "*-----sd-unidle started");

  int i=0;

  while (1) {
    /* Разремариваем, если хотим завершить процесс по истечении 60 мин., иначе бесконечный цикл */
    if (i == 12) {
      //syslog(LOG_INFO, "*-----sd-unidle terminated by time");
      //closelog();
      //break; /* Закрываем приложение через 5*12 = 60 мин. */
    }

    i=i+1;

    sleep(300); /* ждем 5 минут */
    system("/media/DISK_A1/system/usr/sbin/smartctl -i -d sat,12 /dev/sda | grep 'Device Model'"); /* или любой ваш скрипт */
    syslog(LOG_INFO, "*-----sd-unidle read smart from SAMSUNG HD204UI");
  }

  exit(EXIT_SUCCESS);
}

Отредактировано vovic67 (2012-02-15 16:29:48)