Esiste un modo rapido per, dato un file eseguibile, creare un servizio Windows che, quando avviato, lo avvia?
Esiste un modo rapido per, dato un file eseguibile, creare un servizio Windows che, quando avviato, lo avvia?
Risposte:
Per creare un servizio Windows da un eseguibile, è possibile utilizzare sc.exe
:
sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"
È necessario disporre di virgolette attorno al exe
percorso effettivo e uno spazio dopo il binPath=
.
Ulteriori informazioni sul sc
comando sono disponibili in Microsoft KB251192 .
Si noti che non funzionerà per qualsiasi eseguibile: l'eseguibile deve essere un servizio Windows ( ovvero implementare ServiceMain ). Quando si registra un eseguibile non di servizio come servizio, si verifica il seguente errore quando si tenta di avviare il servizio:
Errore 1053: il servizio non ha risposto tempestivamente alla richiesta di avvio o controllo.
Esistono strumenti in grado di creare un servizio Windows da eseguibili arbitrari non di servizio, vedere le altre risposte per esempi di tali strumenti.
binpath=
insieme a dover circondare il percorso eseguibile con virgolette doppie è totalmente sbagliato, almeno per Windows 10. la quotazione è richiesta se e solo se il percorso contiene caratteri speciali come spazi bianchi. inoltre, il case (lowe / upper / mixed-case) non importa da nessuna parte, anche nei nomi delle variabili, ed displayname="my service"
è un altro vantaggio da passare sulla riga di comando durante la creazione di un servizio da visualizzare come prima riga ( Name
) services.msc
.
binPath=
stato richiesto per me su Windows 7 ma non su Windows 10
Utilizzare NSSM ( il gestore del servizio non succhiante ) per eseguire un .BAT o qualsiasi file .EXE come servizio.
nssm.exe install [serviceName]
Risposta estesa (Kevin Tong).
Passaggio 1: Scarica e decomprimi nssm-2.24.zip
Passaggio 2: dal tipo di riga di comando:
C:\> nssm.exe install [servicename]
aprirà la GUI come di seguito (l'esempio è il server UT2003), quindi sfoglialo semplicemente su: yourapplication.exe
Ulteriori informazioni su: https://nssm.cc/usage
nssm.exe install [serviceName]
. Questa soluzione funziona ma se si dispone di un'applicazione GUI, non funzionerà su Win Serever2003. Se in seguito desideri rimuoverlo, utilizzanssm.exe remove [youservicename]
nginx
non è necessario e fuorviante. Il comando funzionerà anche senza di esso. È un parametro facoltativo se si desidera fornire il nome del servizio dal prompt dei comandi.
Molte risposte esistenti includono l'intervento umano al momento dell'installazione. Questo può essere un processo soggetto a errori. Se hai molti eseguibili che vuoi installare come servizi, l'ultima cosa che vuoi fare è eseguirli manualmente al momento dell'installazione.
Verso lo scenario sopra descritto, ho creato serman , uno strumento da riga di comando per installare un eseguibile come servizio. Tutto quello che devi scrivere (e scrivere solo una volta) è un semplice file di configurazione del servizio insieme al tuo eseguibile. Correre
serman install <path_to_config_file>
installerà il servizio. stdout
e stderr
sono tutti registrati. Per maggiori informazioni, dai un'occhiata al sito web del progetto .
Un file di configurazione funzionante è molto semplice, come dimostrato di seguito. Ma ha anche molte funzioni utili come <env>
e <persistent_env>
sotto.
<service>
<id>hello</id>
<name>hello</name>
<description>This service runs the hello application</description>
<executable>node.exe</executable>
<!--
{{dir}} will be expanded to the containing directory of your
config file, which is normally where your executable locates
-->
<arguments>"{{dir}}\hello.js"</arguments>
<logmode>rotate</logmode>
<!-- OPTIONAL FEATURE:
NODE_ENV=production will be an environment variable
available to your application, but not visible outside
of your application
-->
<env name="NODE_ENV" value="production"/>
<!-- OPTIONAL FEATURE:
FOO_SERVICE_PORT=8989 will be persisted as an environment
variable to the system.
-->
<persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>
questi extra si rivelano utili .. devono essere eseguiti come amministratore
sc create <service_name> binpath=<binary_path>
sc stop <service_name>
sc queryex <service_name>
sc delete <service_name>
Se il nome del tuo servizio ha spazi, racchiudi tra "virgolette".
sc create <service_name> binpath= <binary_path>
Puoi dare un'occhiata alla mia piccola utility gratuita per le operazioni di creazione / modifica \ eliminazione del servizio. Ecco un esempio di creazione:
Vai a Servizio -> Modifica -> Crea
File eseguibile (google drive): [Scarica]
Codice sorgente: [Scarica]
Post del blog: [BlogLink]
Classe dell'editor di servizio: WinServiceUtils.cs