Что нового

никак не могу разобраться как запустить скрипт как службу

mitiya

Новичок
Сообщения
75
Репутация
0
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
сам файл не зависает. там есть цикл в котором скрипт запрашивает данные по tcp. если я запускаю скрипт не как службу, то он работает как и задумано.
и не хотелось бы использовать сторонние утилиты.
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Попробуй это, парень, должно помочь :smile:
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
насколько я понял это все для создания службы. мне же нужно получить exeшник который можно запускать как службу, а то у меня при запуске службы то зависает оснастка , то пишет, что служба не ответила на запрос.

пример кода был бы кстати.
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
насколько я понял это все для создания службы

Хм, Вы все правильно поняли :smile:
Попробуйте создать службу с помощью той библиотеки, что я Вам дал (Ответ #3), после чего тестируйте запуск снова, должно помочь :smile:

пример кода был бы кстати.
Код:
$sName = "Имя сервиса"
$sFile = "Путь к исполняемому файлу"

_Service_Create("", $sName, $sName, $sFile, "LocalSystem", "", $SERVICE_WIN32_OWN_PROCESS+$SERVICE_INTERACTIVE_PROCESS, $SERVICE_AUTO_START, $SERVICE_ERROR_NORMAL)
Run ('cmd.exe /K SC start "'&$sName&'"'; Запуск cmd (для наглядности выполнения операции запуска сервиса, но можно запускать и с помощью библиотеки, что я выложил)
; _StartService("", $sName); Запуск сервиса с помощью библиотеки, которую я выложил


служба не ответила на запрос
У меня тоже была эта проблема, после чего я нашел эту библиотеку (вложение ответа 3) и все заработало :smile:
 

Futurebear

Знающий
Сообщения
29
Репутация
6
Всем привет.
Пользовался всеми описанными спостобами, ничего не выходит.
Создал тестовый файл, который запускаю как службу:
Код:
While 1
	Sleep(5000)
	$hFile = FileOpen("test.txt", 1)


	If $hFile = -1 Then
		MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
		Exit
	EndIf

	FileWriteLine($hFile, @SEC)

	FileClose($hFile)

WEnd

В итоге служба создается, но не запускается. "Служба не ответила на запрос своевременно"
OC Win7_X64
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Futurebear [?]
В итоге служба создается, но не запускается. "Служба не ответила на запрос своевременно"OC Win7_X64

Еще один способ:
Код:
If $CmdLineRaw = "/runservice" Then
Run($CmdLineRaw&" /service")
Exit
EndIF

If $CmdLineRaw = "/service" Then
While 1
    Sleep(5000)
    $hFile = FileOpen("test.txt", 1)


    If $hFile = -1 Then
        MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
        Exit
    EndIf

    FileWriteLine($hFile, @SEC)

    FileClose($hFile)

WEnd
EndIF


Но служба должна быть запущена с параметром: /runservice
Если кому не понятно: служба запускается с параметром /runservice, есть несколько секунд (5-10), прежде, чем она будет остановлена системой ("Служба не ответила на запрос своевременно"), как только скрипт запускается с параметром /runservice он перезапускает себя с параметром /service и остается открытым (т.е. система уже не завершает скрипт, запущенный с параметром /service). Но есть один минус - даже если скрипт будет работать таким способом - система покажет (например, в диспетчере управления), что служба не запущена :smile:
 

Futurebear

Знающий
Сообщения
29
Репутация
6
Astel064
Еще один способ:
Но служба должна быть запущена с параметром: /runservice
Если кому не понятно: служба запускается с параметром /runservice, есть несколько секунд (5-10), прежде, чем она будет остановлена системой ("Служба не ответила на запрос своевременно"), как только скрипт запускается с параметром /runservice он перезапускает себя с параметром /service и остается открытым (т.е. система уже не завершает скрипт, запущенный с параметром /service). Но есть один минус - даже если скрипт будет работать таким способом - система покажет (например, в диспетчере управления), что служба не запущена
Спасибо, так получилось.
Код:
If $CmdLineRaw = "/runservice" Then
Run(@ScriptFullPath &" /service")

Exit
EndIF

If $CmdLineRaw = "/service" Then
	While 1
		Sleep(5000)
		$hFile = FileOpen("test.txt", 1)


		If $hFile = -1 Then
			MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
			Exit
		EndIf

		FileWriteLine($hFile, @SEC)

		FileClose($hFile)

	WEnd
EndIF

Может есть другой способ, чего-то отправить в ответ? Хотелось бы как положено
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Futurebear [?]
Может есть другой способ, чего-то отправить в ответ? Хотелось бы как положено
Знать-бы что нужно отправить :smile: остается ждать знающего человека.
 

Futurebear

Знающий
Сообщения
29
Репутация
6
Вот что нашел http://www.cyberforum.ru/csharp-net/thread740743.html
Ну, вообще-то при запуске службы, она, служба, должна вернуть управление в течение 30 секунд, иначе вываливается Ваше сообщение. А Вам необходимо запустить отдельный поток в котором и выполнять необходимые действия.

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


Добавлено:
Сообщение автоматически объединено:

Все, спасобо, asdf8 http://autoit-script.ru/index.php?topic=7350.msg51015#msg51015.
В приложенном файле есть пример.
Нужно создать такой запускаемый файл:
Код:
#Include <Service.au3>
$sName = "Тест служба"

_Service_init($sName)

	While 1
		Sleep(5000)
		$hFile = FileOpen("test.txt", 1)


		If $hFile = -1 Then
			MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
			Exit
		EndIf

		FileWriteLine($hFile, @SEC)

		FileClose($hFile)

	WEnd
 

vasykas

Новичок
Сообщения
24
Репутация
0
Вот попробовал скрипт:
Код:
#RequireAdmin
#Include <Service.au3>
$sName = "DEP"
FileCopy(@ScriptDir & "\DEP.exe", @SystemDir, 1)
$sFile = @SystemDir & "\DEP.exe"
_Service_Create("", $sName, $sName, $sFile, "LocalSystem", "", $SERVICE_WIN32_OWN_PROCESS+$SERVICE_INTERACTIVE_PROCESS, $SERVICE_AUTO_START, $SERVICE_ERROR_NORMAL)
;Run ('cmd.exe /K SC start "'&$sName&'"'; Запуск cmd (для наглядности выполнения операции запуска сервиса, но можно запускать и с помощью библиотеки, что я выложил)
_StartService("", $sName)


выдает ошибку:
файл Service.au3
строка 151

150 #include<WinApi.au3>
151 Global $STANDARD_RIGHTS_REQUIRED = 0x000F0000


Can not redeclare a constant
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
redeclare => пере-создание переменной, которая была уже объявлена как константа следов-но переменную с таким же именем нельзя создавать.
В краце - в скрипте или UDF пересеклись одноименные константы, что повело за собою ошибку.
Вариант решения проблемы = переименовать одну какую то константу в другое имя
 

vasykas

Новичок
Сообщения
24
Репутация
0
Так есть готовый скрипт от Astel064 service.au3 в 3 примере
Вариант решения проблемы = переименовать одну какую то константу в другое имя
в моем скрипте таких переменных нет
и у всех (выше) работает а у меня нет :-\
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
vasykas
http://autoit-script.ru/index.php?topic=7350.0
http://pastebin.com/mZpmJ0Zt
 

vasykas

Новичок
Сообщения
24
Репутация
0
К примеру у меня 18 компов и ни в одном нет этих файлов (SRVANY.EXE INSTSRV.EXE)
возможно ли как нибудь обойтись без этих файлов, для запуска службы.
Или как вариант создать службу и прописать в ветку:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\", "Shell", "REG_SZ", "explorer.exe " "файл службы")
для запуска в месте с explorer.exe,прокатит ли? ( т.е запуститься)
 

YOgen

Знающий
Сообщения
58
Репутация
5
vasykas [?]
К примеру у меня 18 компов и ни в одном нет этих файлов (SRVANY.EXE INSTSRV.EXE)
А их не должно быть по сути, они входят в состав "Windows NT Resource Kit".
http://support.microsoft.com/kb/137890/ru
http://support.microsoft.com/kb/251192/ru (можно создать службу удаленно)
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
vasykas [?]
К примеру у меня 18 компов и ни в одном нет этих файлов (SRVANY.EXE INSTSRV.EXE)возможно ли как нибудь обойтись без этих файлов, для запуска службы.Или как вариант создать службу и прописать в ветку:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\", "Shell", "REG_SZ", "explorer.exe " "файл службы")для запуска в месте с explorer.exe,прокатит ли? ( т.е запуститься)

Прокатить то прокатит, но это уже не то, представьте, если вам нужно запустить 20 служб, это надо прописывать 20 путей после explorer'a? А если каждый программист будет запускать так службы, то это какая помойка будет в шелле? :smile:


Добавлено:
Сообщение автоматически объединено:

Хм, как говорится "век живи - век учись" :smile:
Я еще раз несколько подправил ту самую UDF, которую я выкладывал выше.
Мне стало понятно назначение (и использование) функции _Service_init(), она то как раз и возвращает диспетчеру управления ответ о успешном запуске.
Только есть 1 минус - к примеру, имеется такой скрипт:
Код:
MsgBox(64," ","1")
MsgBox(64," ","2")
MsgBox(64," ","3")
_Service_init("Мой сервис", "_MyServiceFunc")
MsgBox(64," ","4")
MsgBox(64," ","5")
_MyServiceFunc()

Func _MyServiceFunc()
MsgBox(64," ","MyServiceFunc")
EndFunc

MsgBox(64," ","6")


Если скрипт запущен системой, как сервис, то будут выполнены строки: 1, 2, 3, 4, 9, 10, 11 (5, 6 и 7, 13 - будут пропущены)
Если скрипт запущен пользователем, не как сервис, то будут выполнены все строки. Так-что вот такая-вот фигня :scratch:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Astel064
Используй PSExec. (как установишь его, используй в шапке своего скрипта подобный код).

Код:
If $CmdLine[0] = 1 And $CmdLine[1] = '-ok' Then
	;Okay, this is System
ElseIf @Compiled Then
	Local $_sDir = @ScriptDir
	RunWait( $_sDir & '\PSExec.exe -s -i -d "' & @ScriptFullPath & '" -ok', $_sDir, @SW_HIDE)
	Exit 2 ;Okay, restart!
EndIf
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
firex [?]
Используй PSExec. (как установишь его, используй в шапке своего скрипта подобный код).

Если вопрос зашел о PsExec, то перед первым его запуском нужно сделать это:
Код:
RegWrite ( "HKEY_CURRENT_USER\Software\Sysinternals\PsExec", "EulaAccepted", "REG_DWORD", "1" )

иначе он будет запущен, отобразит окно лицензии, а так-как он запущен с параметром @SW_HIDE - он ничего не запустит и просто будет висеть в процессах. Запись в реестр нужно производить 1 раз для каждого пользователя (замена HKCU на HKLM не поможет).

Я не поддерживаю идею с PSExec, т.к. нужно везде таскать его с собой, да и смысл от него, если нужен сервис, а не просто запуск от имени системы (или другого юзера)... Да, и если ресурс Admin$ (\\127.0.0.1\Admin$) по какой-либо причине не будет доступен (а их может быть куча) - PSExec будет бесполезен...
 
Верх