1 (2018.09.16 16:08:11 отредактировано makex)

Тема: Отключение ПК при бездействии сервера

Доброго времени суток, форумчане!)
Помогите горю)) перешел на этот сервер, т.к. купил 4к телек, и только HMS у меня смог протянуть без подвисонов воспроизведение.
Но есть проблема со сном.
Если в настройках поставить галку чтоб сервер препятствовал переходу в спящий режим, то комп не усыпает никогда!. Хотелось бы чтобы комп уснул, если сервер бездействует, ну скажем 30 мин. У меня винда при этом таймере уходит в сон.
Если убрать галку о препятствии, то комп засыпает во время воспроизведения фильма (по стандартному таймеру винды).
В событиях есть позиция, бездействе сервера 30 минут, вот только обработки подходящей по умолчанию нет.
Если уводить в сон при бездействии сервера, то он уснет пока я за ним работаю)) это не есть хорошо((

P.S. писал в соседней теме, но отклика не нашел, решил создать отдельную тему

2

Re: Отключение ПК при бездействии сервера

makex пишет:

Хотелось бы чтобы комп уснул, если сервер бездействует, ну скажем 30 мин.

makex пишет:

Если уводить в сон при бездействии сервера, то он уснет пока я за ним работаю)) это не есть хорошо((

Непонятно, при каких обстоятельствах нужно, чтобы комп уходил в сон?

Sony Bravia KDL-32CX523

3 (2018.09.16 22:15:04 отредактировано makex)

Re: Отключение ПК при бездействии сервера

Когда за ним никто и ничто не работает в течении 30 минут.
я использовал скрипт взятый из соседней темы:

///////////////////////////////////////////////////////////////////////////////
// Функция запуска указанной команды на выполнение
bool ExecuteCmd(string sCmd) {
  bool bSuccess = false; variant objShell;
  try { 
    objShell = CreateOleObject("WScript.Shell"); 
    objShell.Run(sCmd);
    bSuccess = true;
  } except {
    if (VarType(objShell) != varDispatch)
      ShowMessage("Невозможно создать ActiveXObject WScript.Shell для запуска выключения компьютера.");
    else
      ShowMessage("Ошибка запуска команды "+sCmd);
  }
  return bSuccess;
}

///////////////////////////////////////////////////////////////////////////////
//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
///////////////////////////////////////////////////////////////////////////////
{
  ExecuteCmd("rundll32 powrprof.dll,SetSuspendState Standby"); // Выполнение команды выключения компьютера
//  ExecuteCmd("Rundll32.exe powrprof.dll,SetSuspendState Sleep"); // Выполнение команды выключения компьютера
}

если поставить его на событие о бездействии сервера 30 мин, то он вырубит комп даже если я работаю за ним

Я думаю надо его как-то связать с виндовским таймером
https://docs.microsoft.com/ru-ru/window … utionstate
к сожалению я не программист)) ((

4

Re: Отключение ПК при бездействии сервера

Можно пойти от обратного. Проверять бездействие компьютера штатными средствами ОС.
Вот описание: https://docs.microsoft.com/en-us/window … conditions
Т.е. в планировщике задач создать триггер, который будет срабатывать при переходе компьютера в состояние бездействия, и при этом проверять - есть ли запущенные задачи у HMS. Вот как HMS чекать внешним скриптом - сходу не скажу. Самое простое и костыльное решение такое:
1. В HMS по скрипту при бездействии создавать во временной папке какой-нибудь файлик, ну например ".idle"
2. В планировщике задач Windows создать триггер, срабатывающий при переходе компьютера в состояние бездействия и запускать батник, который проверяет наличие в папке файла, упомянутого в п. 1.

Если файла нет - ничего не делать.
Если файл есть - выключать компьютер.

5 (2018.09.24 20:51:29 отредактировано makex)

Re: Отключение ПК при бездействии сервера

как посмотрю, вариантов у меня не много))
пользуюсь скриптом выше, там командная строка, но как создать файл чтоб команда была в одну строку, не могу придумать...
лаадно снова поискал и нашел как создать файл в строке)) команда

copy NUL filename.txt

теперь буду пробовать...
ТАААК, вот что вышло )) костляво, но все таки)
создал 3 файла CMD
CreateHMS.idle.cmd

copy NUL D:\Documents\HMS\hms.idle"

FindHMS.idle.cmd

if exist D:\Documents\HMS\hms.idle rundll32 powrprof.dll,SetSuspendState Standby

DelHMS.idle.cmd del

D:\Documents\HMS\hms.idle

В ХМС создал скрипт "создать файл", за основу взят скрипт выше, который запускается, при событии простоя сервера 30 минут

///////////////////////////////////////////////////////////////////////////////
// Функция запуска указанной команды на выполнение
bool ExecuteCmd(string sCmd) {
  bool bSuccess = false; variant objShell;
  try { 
    objShell = CreateOleObject("WScript.Shell"); 
    objShell.Run(sCmd);
    bSuccess = true;
  } except {
    if (VarType(objShell) != varDispatch)
      ShowMessage("Невозможно создать ActiveXObject WScript.Shell для запуска выключения компьютера.");
    else
      ShowMessage("Ошибка запуска команды "+sCmd);
  }
  return bSuccess;
}

///////////////////////////////////////////////////////////////////////////////
//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
///////////////////////////////////////////////////////////////////////////////
{
  ExecuteCmd("D:\\Documents\\HMS\\CreateHMS.idle.cmd"); // Выполнение скрипта создания файла
}

в планировщике Windows была создана задача: HMS
Триггер - при простое
Действие - запустить D:\Documents\HMS\FindHMS.idle.cmd
Условие - при простое 30 минут
ОК
создаю еще одну задачу HMS_del
Триггер - при событии - настраиваемое - По журналу - Журнал Windows - Система - Источник событий - Power-Troubleshootter - Код событий - 1,300
Действие - запустить D:\Documents\HMS\DelHMS.idle.cmd
ОК

в ручном режиме позапускал задачи, создают, находят и удаляют файл. Надеюсь и автоматизация пройдет удачно. Сегодня вечер-ночь покажет)))

6

Re: Отключение ПК при бездействии сервера

makex пишет:

пользуюсь скриптом выше, там командная строка, но как создать файл чтоб команда была в одну строку, не могу придумать...

Если пользуетесь скриптом выше, то создавать файл через командную строку не обязательно (скорее всего она у вас срабатывает, но т.к. текущий каталог может быть системным, то там ему отказано из-за нехватки прав или он создаётся, да не там, где вы ожидаете).
Проще в том скрипте выше, вместо вызова функции ExecuteCmd просто написать команду создания файла по жесткому пути:

///////////////////////////////////////////////////////////////////////////////
//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  HmsStringToFile('', 'D:\\filename.txt');
}
Sony Bravia KDL-32CX523

7

Re: Отключение ПК при бездействии сервера

WendyH

спасибо)) но я уже тут наваял чего-то)))
если кто-то адаптирует, буду признателен))
тааак, но код попробую для собственного развития

8

Re: Отключение ПК при бездействии сервера

//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  HmsStringToFile('', 'D:\\filename.txt');
}

Все четко работает)) от одного батника можно избавиться))

9

Re: Отключение ПК при бездействии сервера

Немного подправил в планировщике Запуск при простое 30 мин скрипта FindHMS.idle.cmd.
Поставил поставил Запуск при простое 30 минут и перезапуск задачи каждые 10 минут.
Таким образом получается, что если простой был 30 минут и в это время ХМС работал, то при остановке работы ХМС, по событию ХМС создастся файлик, а планировщик уже отработал свое время и задачу.
Я, наверное, больше для себя все это пишу, чтобы самому разобраться в этих событиях. Но сейчас мне нравится как работает!)
Странно что из коробки такой функции нет((
Всем спасибо!

10 (2018.10.09 20:01:52 отредактировано unq)

Re: Отключение ПК при бездействии сервера

я сделал так:
скрипт "HMS30minIdle" установил для события "бездействие сервера"

{
  HmsStringToFile("", "D:\\CACHES\\HMS\\HMS30minIdle.txt");
}

скрипт HMS30minIdleDelete установил для события "после начала воспроизведения медиаресурса"

bool ExecuteCmd(string sCmd) {
  bool bSuccess = false; variant objShell;
  try { 
    objShell = CreateOleObject("WScript.Shell"); 
    objShell.Run(sCmd);
    bSuccess = true;
  } except {
    if (VarType(objShell) != varDispatch)
      ShowMessage("Невозможно создать ActiveXObject WScript.Shell для запуска выключения компьютера.");
    else
      ShowMessage("Ошибка запуска команды "+sCmd);
  }
  return bSuccess;
}

{
  ExecuteCmd("D:\\CACHES\\HMS\\HMSdel30minidlefile.bat");
}

два бат-файла:
HMSdel30minidlefile.bat

del "D:\CACHES\HMS\HMS30minIdle.txt" /s /f /q

HMSSleep.bat

if exist D:\CACHES\HMS\HMS30minIdle.txt (
del "D:\CACHES\HMS\HMS30minIdle.txt" /s /f /q
rundll32.exe powrprof.dll,SetSuspendState 0,1,0
)

ну и собственно TaskSchedule:
Trigger: on Idle, repeat every 30 minutes for duration of Indefinitely
Action: start program D:\CACHES\HMS\HMSSleep.bat
Condition: Start the task only if the computer idel for 1hour, wait for idle for: do not wait
stop if the computer ceases to be idle

у меня гибернация выключена. но если у вас включена, то батник HMSSleep.bat надо сделать таким.

if exist D:\CACHES\HMS\HMS30minIdle.txt (
del "D:\CACHES\HMS\HMS30minIdle.txt" /s /f /q
powercfg -hibernate off
rundll32.exe powrprof.dll,SetSuspendState 0,1,0
powercfg -hibernate on
)

11

Re: Отключение ПК при бездействии сервера

работает, но все равно как-то костляво. часто выскакивает окно cmd, буквально не секунду, что немного напрягает... задача, как понимаю запускается много раз и отрабатывает скрипт поиска файла.
придется, наверно отказываться от HMS((( к сожалению..((
кажалось бы простой и нужный функционал, а не реализован... жаль...

12

Re: Отключение ПК при бездействии сервера

Пришел в голову еще один вариант. Идея сырая, но, имхо, с перспективами.

Отойти от схемы windows idle - HMS-событие при бездействии сервера 30 мин.

Взять на вооружение powershell.
Слепить cmdlet, который будет запускаться только при активном состоянии idle компьютера. Это не такая тривиальная задача, как оказалось судя по выдаче гугла, но думаю вполне решаемая.
Добиться четкого выполнения cmdlet'а.
А в самом скрипте проверять состояние HMS, ну например на предмет наличия/отсутствия активных сессий. В состоянии IDLE HMS должен только слушать TCP порты.

Например выдача netstat: netstat -o -a -n | findstr "7660", где 7660 PID процесса HMS

 Proto   SRC IP                 DST IP                 STATE           PID
  TCP    192.168.1.10:45397     0.0.0.0:0              LISTENING       7660
  TCP    192.168.1.10:45397     192.168.1.15:54316     CLOSE_WAIT      7660
  TCP    192.168.1.10:45397     192.168.1.15:54352     CLOSE_WAIT      7660
  TCP    192.168.1.10:45397     192.168.1.15:54359     ESTABLISHED     7660
  UDP    192.168.1.10:1900      *:*                                    7660

Вот отсутствие адресов в столбце "DST IP", или наличие соединений только в состоянии LISTENING можно считать за "простой" HMS.

Ну и выключать комп стандартными средствами powershell.

Таким образов городить огород с кучей промежуточных батников не потребуется.

13

Re: Отключение ПК при бездействии сервера

Да примерно это я и хотел как итог увидеть, но я не программист и даже задачу сформулировать не смог.

HMS, ведь знает что дает поток https://cdn1.savepice.ru/uploads/2018/12/23/eb08601693944b5b045e72d937c93c5a-full.png
вот пока он есть и не вырубался бы комп, держал. нет потока и стандартный бы виндовс отслеживал простой

Надо чтоб HMS держал комп пока есть активное соединение, всего делов то)))

14

Re: Отключение ПК при бездействии сервера

Перепробовал разные сервера, они тоже уходят в сон при работе. Я кидаю на телек без транскодирования, может поэтому он не чувствует работу?
остановился на Serviio, к нему есть вот такая отдельная программка http://forum.serviio.org/viewtopic.php?f=17&t=12136 , для HMS бы подобную надстроечку, кто написал бы...)

15 (2018.12.27 10:42:55 отредактировано d1mas)

Re: Отключение ПК при бездействии сервера

Нашел еще одно решение.

Есть такая замечательная программка-автоматизатор - AutoIt https://www.autoitscript.com

Идея в том, чтобы отказаться от запуска bat файлов, а использовать указанную программку для "интеллектуального" выключения компьютера.

Сценарий такой:

1. В HMS делаем две обработки. Обе они пишут в один и тот же файл.
1.1 Одна при бездействии сервера 30 мин пишет например так:

//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  HmsStringToFile('hms.idle', 'D:\\filename.txt'); // ключевое тут hms.idle
}

1.2 Вторая при запросе на воспроизведение. Она как бы сбрасывает признак бездействия HMS

//                     Г Л А В Н А Я   П Р О Ц Е Д У Р А                     //
{
  HmsStringToFile('', 'D:\\filename.txt'); // ключевое слово тут не важно, главное не должно быть hms.idle
}

2. Для AutoIt пишем такой скрипт:

#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
; Коды для вызова команды shutdown. Можно использовать в комбинации, т.е. суммируя:
;    $SD_LOGOFF (0) = Logoff
;    $SD_SHUTDOWN (1) = Shutdown
;    $SD_REBOOT (2) = Reboot
;    $SD_FORCE (4) = Force
;    $SD_POWERDOWN (8) = Power down
;    $SD_FORCEHUNG (16) = Force if hung
;    $SD_STANDBY (32) = Standby
;    $SD_HIBERNATE (64) = Hibernate

CheckHMSState()

Func CheckHMSState()
   ; Заполнить две константы ниже
   Local Const $sFilePath = "c:\temp\HMS.STATE"    ; полный путь к файлу, в котором хранится состояние HMS
   Local Const $sIDLE = "hms.idle"                ; строка-триггер - HMS 30 минут бездействует

   Local $hFileOpen = FileOpen($sFilePath, $FO_READ)
   if $hFileOpen = -1 Then
      ; Не удалось открыть файл. Просто завершаем приложение
      Return False
   EndIf
   Local $sFileRead = FileReadLine($hFileOpen, 1)
   if $sFileRead = 1 Then
      ; Не удалось прочитать из файла. Просто завершаем приложение
      Return False
   EndIf
   FileClose($hFileOpen)

   if StringInStr($sFileRead, $sIDLE, $STR_NOCASESENSE) Then
      Local $iDelete = FileDelete($sFilePath)                ; Подчищаем
      ;Shutdown (64)                                         ; Раскомментировать для выключения компьютера
      MsgBox($MB_SYSTEMMODAL, "TEST", "Ready to shutdown")    ; Для тестирования. Закомментировать впоследствии
   EndIf

EndFunc

Задаем в нем константы, аналогично тем, что используются в обработках HMS, а именно путь к файлу с состоянием HMS и слово-триггер.
Ну и раскомментируем строку Shutdown(код). Описание кодов в скрипте.
3.Средствами AutoIt компилируем скрипт в исполняемый exe файл (можно даже для х64 систем).
4. Вызываем этот скомпилированный экзешник в планировщике задач Windows в соответствии с настройками, любезно описанными unq:
Trigger: on Idle, repeat every 30 minutes for duration of Indefinitely
Action: start program "путь к исполняемому файлу, полученному на шаге 3"
Condition: Start the task only if the computer idel for 1hour, wait for idle for: do not wait
stop if the computer ceases to be idle

Все.
Никаких окон не появляется. Никаких батников не запускается. Все делается штатными средствами HMS. А уже при бездействии компьютера запускается этот экзешник, проверяет содержимое файла и в зависимости от его содержимого либо завершает работу, либо выключает компьютер.

P.S. Вообще программуля очень крутая. Не исключаю, что её можно научить отслеживать состояние HMS (чтобы не тратить обработки). Но на скорую руку вполне и так.

P.S.1 Добавил в скрипт строку с удалением файла-состояния и сам скрипт во архиве.

Прикреплённые файлы сообщения

hms.idle.zip 951 b, скачивалось 25 раз, начиная с 2018.12.27

Спасибо сказали: Hunter1