Включение linux в заданное время

Материал из poiuty wiki
Перейти к: навигация, поиск

Майнинг стал убыточным. Чтобы сократить расходы, будем добывать монеты ночью.
Существенная разница между тарифами пик [7-00 - 10-00, 17-00 - 21-00], полу-пик [10-00 - 17-00, 21-00 - 23-00] и ночь [23-00 - 7-00].

пик	4.92 руб./кВт.ч
ночь	1.26 руб./кВт.ч
полупик	4.08 руб./кВт.ч

Скрипт запускает sgminer в 23.00
В 7 утра (перед выключением) добавляем "задание" в RTC => включит комп в 22.55
Работает это так -> записываем время (time now + 5 минут).

echo `date '+%s' -d '+ 5 minutes'` > /sys/class/rtc/rtc0/wakealarm

Проверяем

# cat /sys/class/rtc/rtc0/wakealarm
1426786194

# cat /proc/driver/rtc
rtc_time        : 17:25:03
rtc_date        : 2015-03-19
alrm_time       : 17:29:54
alrm_date       : 2015-03-19
alarm_IRQ       : yes
alrm_pending    : no
update IRQ enabled      : no
periodic IRQ enabled    : no
periodic IRQ frequency  : 1024
max user IRQ frequency  : 64
24hr            : yes
periodic_IRQ    : no
update_IRQ      : no
HPET_emulated   : yes
BCD             : yes
DST_enable      : no
periodic_freq   : 1024
batt_status     : okay

Выключаем комп.

shutdown -h now

Через несколько минут он включится снова. Подробнее про RTC можно почитать в теме на LOR и в этой вики.

Пример на PHP

#!/usr/bin/php
<?php
 
	function getsock($addr, $port)
	{
        $socket = null;
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 
        if ($socket === false || $socket === null)
        {
			$error = socket_strerror(socket_last_error());
			$msg = "socket create(TCP) failed";
			die("ERR: $msg '$error'\n");
			return null;
		}
 
        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 5, 'usec' => 0));
        socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 5, 'usec' => 0)); 
 
        $res = @socket_connect($socket, $addr, $port);
        if ($res === false)
        {
			//$error = socket_strerror(socket_last_error());
			//$msg = "socket connect($addr,$port) failed";
			//die("ERR: $msg '$error'\n");
			socket_close($socket);
			return null;
		}
 
        return $socket;
	}
 
 
		function readsockline($socket)
	{
        $line = '';
        while (true)
        {
			$byte = socket_read($socket, 1);
			if ($byte === false || $byte === '')
			break;
			if ($byte === "\0")
			break;
			$line .= $byte;
		}
        return $line;
	}
 
		function request($cmd, $ip, $port)
	{
        $socket = getsock($ip, $port);
 
        if ($socket != null)
        {
			socket_write($socket, $cmd, strlen($cmd));
			$line = readsockline($socket);
			socket_close($socket);
 
			if (strlen($line) == 0)
			{
				//echo "WARN: '$cmd' returned nothing\n";
				return $line;
			}
 
			if (substr($line,0,1) == '{')
			return json_decode($line, true);
 
			$data = array();
 
			$objs = explode('|', $line);
			foreach ($objs as $obj)
			{
				if (strlen($obj) > 0)
				{
					$items = explode(',', $obj);
					$item = $items[0];
					$id = explode('=', $items[0], 2);
					if (count($id) == 1 or !ctype_digit($id[1]))
					$name = $id[0];
					else
					$name = $id[0].$id[1];
 
					if (strlen($name) == 0)
					$name = 'null';
 
					if (isset($data[$name]))
					{
						$num = 1;
						while (isset($data[$name.$num]))
						$num++;
						$name .= $num;
					}
 
					$counter = 0;
					foreach ($items as $item)
					{
						$id = explode('=', $item, 2);
						if (count($id) == 2)
						$data[$name][$id[0]] = $id[1];
						else
						$data[$name][$counter] = $id[0];
 
						$counter++;
					}
				}
			}
 
			return $data;
		}
 
        return null;
	}
 
$hour = date("G" ,time());
 
function check_sgminer(){
if(empty(request("devs","127.0.0.1",4001)))	return 'no';
	else return 'yes';
}
 
if($hour >= 7 && $hour < 23 && check_sgminer() == 'yes'){
	$time = new DateTime(date("F j, Y, 22:55", time()));
	if(time() > $time->getTimestamp()+60*10){
		$time = new DateTime(date("F j, Y, 22:55", strtotime('+1 day')));
	}
	shell_exec("echo '".$time->getTimestamp()."' > /sys/class/rtc/rtc0/wakealarm");
	sleep(5);
	shell_exec("shutdown -h now"); 
}
if(($hour >= 23 || $hour < 7) && check_sgminer() == 'no') shell_exec("cd /root/v5/ && screen -dmS mine /root/v5/start.sh > /dev/null 2>/dev/null &");

Результаты

Ферма уменьшилась на три карты (2xR9 270X и HD 7790)
Статистика потребления электроэнергии с начала года.
19c5d98e16219216b8ad9d45ce71.png

Счет за прошлый месяц.
99d7e94da962882da7c5f95e28db.png

Счет за этот месяц. Экономия практически три тысячи рублей.
b2caefc97c7bb884e5802dbf7ed2.png