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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 可以在`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天前
|
Python Windows
在 Windows 平台下打包 Python 多进程代码为 exe 文件的问题及解决方案
在使用 Python 进行多进程编程时,在 Windows 平台下可能会出现将代码打包为 exe 文件后无法正常运行的问题。这个问题主要是由于在 Windows 下创建新的进程需要复制父进程的内存空间,而 Python 多进程机制需要先完成父进程的初始化阶段后才能启动子进程,所以在这个过程中可能会出现错误。此外,由于没有显式导入 Python 解释器,也会导致 Python 解释器无法正常工作。为了解决这个问题,我们可以使用函数。
15 5
|
8天前
|
缓存 数据安全/隐私保护 虚拟化
windows端口被占用,无法通过netstat找到进程,占用的端口又不能修改,该怎么办?
项目运行时服务器8080端口被占用,常规`netstat`命令找不到占用进程。解决方法包括:1) 强制关机重启释放端口;2) 使用`netstat -anobq`或Windows 10的`Get-NetTCPConnection` PowerShell命令查找BOUND状态的进程;3) 调整Windows动态端口范围,避免冲突。注意,强制关机可能影响数据安全。
60 2
|
23天前
|
Windows
windows系统bat批处理 网络设置大全 设置静态、动态IP地址
windows系统bat批处理 网络设置大全 设置静态、动态IP地址
22 2
|
2天前
|
Java 数据安全/隐私保护 Windows
ElasticSearch设置密码Windows
ElasticSearch设置密码Windows
7 0
|
2天前
|
网络协议 安全 Docker
windows环境下的设置docker远程访问(开放2375端口)
windows环境下的设置docker远程访问(开放2375端口)
8 0
|
4天前
|
存储 数据安全/隐私保护 Windows
逆向学习Windows篇:进程句柄操作详解
逆向学习Windows篇:进程句柄操作详解
5 0
|
5天前
|
存储 Linux Shell
Linux进程概念(上)
冯·诺依曼体系结构概述,包括存储程序概念,程序控制及五大组件(运算器、控制器、存储器、输入设备、输出设备)。程序和数据混合存储,通过内存执行指令。现代计算机以此为基础,但面临速度瓶颈问题,如缓存层次结构解决内存访问速度问题。操作系统作为核心管理软件,负责资源分配,包括进程、内存、文件和驱动管理。进程是程序执行实例,拥有进程控制块(PCB),如Linux中的task_struct。创建和管理进程涉及系统调用,如fork()用于创建新进程。
21 3
Linux进程概念(上)
|
1天前
|
存储 Shell Linux
Linux进程概念(下)
本文详细的介绍了环境变量和进程空间的概念及其相关的知识。
10 0
Linux进程概念(下)
|
6天前
|
缓存 监控 安全
Linux top命令详解:持续监听进程运行状态
Linux top命令详解:持续监听进程运行状态
22 3
|
10天前
|
Linux 数据处理
深入了解Linux命令kill:终止进程的艺术
**Linux的`kill`命令详解:高效管理进程的工具** `kill`命令在Linux中用于向进程发送信号,如SIGTERM(默认)和SIGKILL,以终止或影响进程行为。它通过进程ID(PID)操作,支持多种信号和选项,如`-l`列出信号,`-9`强制杀进程。例如,`kill 1234`发送TERM信号,`kill -9 1234`发送KILL信号。使用时注意,SIGKILL是不可忽视的,可能导致数据丢失。配合`pgrep`和`pkill`能更灵活管理进程。了解进程依赖和使用其他命令如`ps`和`top`可优化系统资源管理。