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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 可以在`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:查看服务状态

相关文章
|
2月前
|
安全 生物认证 网络安全
windows10无法设置默认保存位置怎么办?显示错误代码0x80070002怎么解决?
Win10系统下载文件时,默认会保存在特定位置,但用户可自行修改。若更改后仍无效,可通过删除目标磁盘中的特定文件夹、修改注册表权限、“干净启动”排除干扰软件或使用第三方修复工具等方式解决此问题。
564 0
|
2月前
|
C++ Windows
Windows10添加自定义右键菜单VS Code
本文介绍了如何在Windows 10中通过修改注册表,将VS Code添加到右键菜单,实现右键文件、文件夹或空白处时使用VS Code打开。方法同样适用于其他程序,如Sublime Text 3。
|
2月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
6月前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
325 5
|
8月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
625 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
9月前
|
运维 监控 Ubuntu
【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出
通过设置内存守护进程,可以有效监控和管理系统内存使用情况,防止内存溢出带来的系统崩溃和服务中断。本文介绍了如何在Ubuntu中编写和配置内存守护脚本,并将其设置为systemd服务。通过这种方式,可以在内存使用超过设定阈值时自动采取措施,确保系统稳定运行。
333 4
|
11月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
141 1
|
12月前
|
存储 开发者 Windows
WINDOWS 环境变量设置方法
本文旨在帮助使用Windows电脑的开发者们为其设备配置环境变量,以更好地支持大模型应用的开发工作。文中详细介绍了三种配置方法:一是将环境变量设置为系统级变量;二是在命令行界面通过`SET`命令或`PowerShell`临时设置变量;三是借鉴MAC的方式,创建全局环境变量文件`.zshrc`进行配置。这些方法简单实用,便于根据实际需求选择适合的方式进行配置。
|
11月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
148 0
|
11月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
362 0