Windows自定义后台进程并设置为开机启动

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
容器镜像服务 ACR,镜像仓库100个 不限时长
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 可以在`Windows`上配置任意一个可执行文件后台启动,并且设置为开机启动。

[TOC]

1 背景

自己开发了一个应用程序,想要再windows上后台运行,并且能够设置为开机启动。

2 目标

可以在Windows上配置任意一个可执行文件后台启动,并且设置为开机启动。

3 应用程序测试代码

测试代码非常简单,就是再运行之后,每隔三秒钟在可执行文件的同级目录的app-logs文件夹中创建文件。如果程序正常运行,那么我们就可以看到新创建的文件。

编译命令:go build -o app.exe main.go

package main

import (
    "fmt"
    "os"
    "time"
)

func main() {
   
   

    dir := "app-logs"
    if err := os.MkdirAll(dir, os.ModePerm); err != nil {
   
   
        fmt.Printf("%s\n", err)
        os.Exit(1)
    }

    for {
   
   
        file := fmt.Sprintf(".\\%s\\app测试_%s.txt", dir, time.Now().Format("2006.01.02_15_04_05"))
        _, err := os.Create(file)
        if err != nil {
   
   
            os.Exit(1)
        }
        time.Sleep(3 * time.Second)
    }
}

4 解决方案

4.1 方案一 使用sc命令注册服务(不推荐)

4.1.1 相关命令

⚠注意:这些命令的执行需要以管理员的方式打开CMD

注册服务:sc create ceshi binpath= D:\Project\ceshi\app.exe type= own start= auto displayname= ceshi,注意等号后面的空格

删除服务:sc delete ceshi

启动服务:sc start ceshi

查看服务:sc query ceshi

4.1.2 测试过程

测试日志如下

C:\Windows\system32>
C:\Windows\system32>
C:\Windows\system32>sc create ceshi binpath= D:\Project\ceshi\app.exe type= own start= auto displayname= ceshi
[SC] CreateService 成功

C:\Windows\system32>sc query ceshi

SERVICE_NAME: ceshi
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

C:\Windows\system32>sc start ceshi
[SC] StartService 失败 1053:

服务没有及时响应启动或控制请求。


C:\Windows\system32>
C:\Windows\system32>sc query ceshi

SERVICE_NAME: ceshi
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x7d0

C:\Windows\system32>
4.1.3 弊端

这种方式注册的服务需要符合一定的规范,否则服务即使能够成功,启动服务时也极有可能报错

4.2 方案二 使用WinSW包装应用程序为服务

4.2.1 步骤

第一步:下载WinSW软件github下载链接

第二步:把WinSW复制到需要启动应用的目录位置,然后重命名,譬如我这里重命名为app-server.exe。重命名的目的是为了后面书写命令更加方便

第三步:在目录中新建和第二步同名的yml配置文件,譬如我这里就是app-server.xml

当然也可以使用XML语法配置文件,WinSW都支持。YAML配置参考链接XML配置参考链接

# 服务ID名称(唯一)
id: App-Server
# 服务显示名称
name: App-Server
# 服务的描述信息
description: 测试APP应用程序
# 环境变量设置
env:
- name: "HOME"
    value: "%BASE%"
# 要执行的可执行文件
executable: "%BASE%/app.exe"
# 可执行文件传递的参数
# server: '%BASE%\data'
log:
mode: roll-by-size
logpath: "%BASE/log%"
sizeThreshold: 10240
keepFiles: 8

⚠注意:这里XML配置文件的名字必须和WinSW文件名相同,因为WinSW启动之后会去寻找同名的配置文件

当前环境如下:

PS D:\Project\ceshi> ls

    目录: D:\Project\ceshi

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024-03-19     21:59       18243033 app-server.exe
-a----        2024-03-19     22:42            859 app-server.xml
-a----        2024-03-19     21:13        4233216 app.exe

第四步:注册服务。以管理员身份启动CMD,进入到上述目录,执行install命令,譬如我这里为:app-server install

D:\Project\ceshi>app-server install
2024-03-19 22:58:45,521 INFO  - Installing service 'App-Server (App-Server)'...
2024-03-19 22:58:45,547 INFO  - Service 'App-Server (App-Server)' was installed successfully.

D:\Project\ceshi>

第五步:按下win + r,然后输入services.msc,打开服务页面,查看列表中是否存在前面注册的服务

第六步:启动服务。以管理员身份启动CMD,进入到上述目录,执行start命令,譬如我这里为:app-server start

D:\Project\ceshi>app-server start
2024-03-19 23:05:24,026 INFO  - Starting service 'App-Server (App-Server)'...
2024-03-19 23:05:24,341 INFO  - Service 'App-Server (App-Server)' started successfully.

D:\Project\ceshi>

第七步:校验服务是否真正启动,是否异常退出。只要发现文件在不同的创建,就说明当前配置没有问题。

PS D:\Project\ceshi> tree /f
卷 软件 的文件夹 PATH 列表
卷序列号为 D32A-2561
D:.
│  app-server.exe
│  app-server.xml
│  app.exe
│
├─app-logs
│      app测试_2024.03.20_07_31_30.txt
│      app测试_2024.03.20_07_31_33.txt
│      app测试_2024.03.20_07_31_36.txt
│      app测试_2024.03.20_07_31_39.txt
│      app测试_2024.03.20_07_31_42.txt
│      app测试_2024.03.20_07_31_45.txt
│
└─logs
        app-server.err.log
        app-server.out.log
        app-server.wrapper.log

第八步:查看服务状态。以管理员身份启动CMD,进入到上述目录,执行status命令,譬如我这里为:app-server status

D:\Project\ceshi>app-server status
Started

D:\Project\ceshi>
4.2.2 WinSW命令说明

install:注册服务

uninstall:卸载服务

start:启动服务,启动服务之前,该服务必须已经安装

stop:停止服务

stopwait:停止服务,直到服务退出,此命令才返回

restart:重启服务

status:查看服务状态

相关文章
|
9天前
|
存储 开发者 Windows
WINDOWS 环境变量设置方法
本文旨在帮助使用Windows电脑的开发者们为其设备配置环境变量,以更好地支持大模型应用的开发工作。文中详细介绍了三种配置方法:一是将环境变量设置为系统级变量;二是在命令行界面通过`SET`命令或`PowerShell`临时设置变量;三是借鉴MAC的方式,创建全局环境变量文件`.zshrc`进行配置。这些方法简单实用,便于根据实际需求选择适合的方式进行配置。
|
1月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
2月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
2月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
2月前
|
安全 Windows
【Azure云服务 Cloud Service】Cloud Service的实例(VM)中的服务描述Software Protection 与 Windows Defender, 如何设置Windows Defender Antivirus服务
【Azure云服务 Cloud Service】Cloud Service的实例(VM)中的服务描述Software Protection 与 Windows Defender, 如何设置Windows Defender Antivirus服务
|
2月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
27天前
|
关系型数据库 数据库 PostgreSQL
在C#中获取与设置Windows的字符编码方式
通过以上步骤,你可以在Docker环境下有效地重启PostgreSQL服务。这对于维护数据库健康、应用更新或环境配置更改后确保数据库服务正常运行至关重要。根据你的具体需求和环境设置,选择合适的方法来执行重启操作。
11 0
|
2月前
|
安全 Shell Windows
记windows自定义bat脚本自启动
【8月更文挑战第27天】在Windows系统中,可让自定义bat脚本自启动的方法有两种:一是利用“启动”文件夹,通过创建bat脚本的快捷方式并将其放置于该文件夹;二是使用任务计划程序,创建一个启动时触发的任务来运行bat脚本。需确保脚本正确安全,避免对系统产生不良影响。
|
2月前
|
Java 应用服务中间件 Windows
【Azure 应用服务】App Service for Windows 环境中为Tomcat自定义4xx/5xx页面
【Azure 应用服务】App Service for Windows 环境中为Tomcat自定义4xx/5xx页面
|
2月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?