二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 随写编年

  • 家人物语

  • 追忆青春

  • 父亲的朋友圈

  • 电影音乐

  • 效率工具

    • Windows时代

      • 个人装机必备之粘贴板工具1clipboard
      • 关于我使用的截图工具以及水印工具
      • 个人知识管理工具一代神器之mybase
      • 与图床相关的各种体验实践
      • utools–最犀利的效率工具分享
      • Typora–可能是最好用的本地Markdown工具
      • 使用Typora+坚果云(github)打造免费的个人云笔记
      • 使用PicGo+GitHub自建免费图床
      • 分享我收藏的Windows装机必备工具(百度云)
      • 批量水印用具配置项
      • Windows10利用winsw将应用封装成系统服务后台启动
        • 1,前言
        • 2,配置 slave
        • 3,服务后台启动
          • 1,安装
          • 2,配置
          • 3,管理
          • 4,注意
          • 5,更多
    • Mac时代

    • 各种插件

    • 优秀工具提名

  • 博客相关

  • 闲言碎语
  • 效率工具
  • Windows时代
二丫讲梵
2022-11-26
目录

Windows10利用winsw将应用封装成系统服务后台启动

文章发布较早,内容可能过时,阅读注意甄别。

# 1,前言

接到一个需求,是基于 Jenkins 给 unity 打包,unity 则需要在 Windows 环境下构建,因此实现这个需求的第一步,就是需要解决给主 Jenkins 添加一个 Windows 节点的 slave。

# 2,配置 slave

创建 slave 的步骤比较简单,这里通过一张截图来看下配置信息:

其他内容都是常规配置,这里不多赘述,需要注意其中标号的两个配置信息。

  1. 记得配置为只允许运行绑定到这台机器的 Job,以免其他正常构建的 Job 调度到这个节点。
  2. 此处使用 Java Web 启动代理的方式与 master 进行连接,需要注意的是,master 节点需要在系统管理 ==> 全局安全设置 ==> 代理中选择指定端口,一般将端口指定为 50000,用于与 slave 节点进行通信。

注意: 使用这种方式通信的 slave 配置方式,务必需要将 Jenkins 的访问域名解析在 Jenkins 的 master 节点上,因为 slave 启动之后,会通过域名与 50000 端口进行建连,如果域名通过其他主机的 Nginx 代理,则会出现建连超时的情况而失败。

当我们将上边的配置保存之后,Jenkins 会给一条启动命令,如下:

$ java -jar agent.jar -jnlpUrl http://jenkins.eryajf.net/computer/windows%2Dunity/jenkins-agent.jnlp -secret 73ed891710ac084b2b45d11b7935032bef012c4415273ded59c85a5a0fbd1bc3 -workDir "C:\tpln-work\jenkins"
1

此时,只要 Windows 主机上有 JDK 环境,那么把 agent.jar 下载之后,在终端使用这条命令启动即可成功配置该 slave 节点。

# 3,服务后台启动

上边介绍了给主 Jenkins 配置一个 Windows 节点的步骤,最后其实是遗留了一个问题,那就是启动 slave 节点的终端还不能关闭,一旦关闭,那么这个节点也就挂了。

看了网上的一些方案,最后选择了一个名为 winsw 的开源项目来解决这个问题:

winsw

将任何应用程序作为 Windows 服务进行包装和管理。

- name: winsw
  desc: 将任何应用程序作为 Windows 服务进行包装和管理。
  avatar: https://avatars2.githubusercontent.com/u/416130?s=460&u=8753e86600e300a9811cdc539aa158deec2e2724&v=4 # 可选
  link: https://github.com/winsw/winsw # 可选
  bgColor: "#0074ff" # 可选,默认var(--bodyBg)。颜色值有#号时请添加单引号
  textColor: "#fff" # 可选,默认var(--textColor)
1
2
3
4
5
6

# 1,安装

安装比较简单,通过 release (opens new window) 可以下载,根据自己系统架构,下载对应版本的包即可:

$ wget https://github.com/winsw/winsw/releases/download/v3.0.0-alpha.10/WinSW-x64.exe
1

此时这个 exe 文件就相当于一个命令行工具,接下来的操作,都将通过这个命令行工具来完成。

你可以把这个文件放在任意一个你方便浏览访问的地方。

我这里将文件单独放在了 soft 目录下:

$ cd C:\soft\winsw
$ cp WinSW-x64.exe jenkins.exe
1
2

建议把名字改成与你要托管的服务一致,便于后期维护管理。

# 2,配置

winsw 依赖 xml 配置文件来对服务进行管理,以下是官方文档的示例:

<service>
  <id>jenkins</id>
  <name>Jenkins</name>
  <description>This service runs Jenkins continuous integration system.</description>
  <env name="JENKINS_HOME" value="%BASE%"/>
  <executable>java</executable>
  <arguments>-Xrs -Xmx256m -jar "%BASE%\jenkins.war" --httpPort=8080</arguments>
  <log mode="roll"></log>
</service>
1
2
3
4
5
6
7
8
9

如上配置信息基本上也都是见名知意,这里简单解析如下:

  • id: 服务 ID 名称(唯一)
  • name: 服务显示名称
  • description: 服务的描述信息
  • env: 配置环境变量
  • executable: 要执行命令的二进制,此处可以写绝对路径
  • arguments: 启动命令跟随的参数

更详细说明,参考: https://github.com/winsw/winsw/blob/v3/docs/xml-config-file.md (opens new window)

我现在是要启动 Jenkins 的 slave,那么根据如上信息,配置文件大概如下:

$ cat jenkins.xml
<service>
  <id>jenkins</id>
  <name>Jenkins</name>
  <description>Jenkins Windows Slave Node.</description>
  <executable>java</executable>
  <arguments>-jar C:\tpln-work\pack\agent.jar -jnlpUrl http://jenkins.eryajf.net/computer/windows%2Dunity/jenkins-agent.jnlp -secret 73ed891710ac084b2b45d11b7935032bef012c4415273ded59c85a5a0fbd1bc3 -workDir "C:\tpln-work\jenkins"</arguments>
  <logmode>rotate</logmode>
</service>
1
2
3
4
5
6
7
8
9

配置文件可以放到与可执行文件相同的目录下。

# 3,管理

配置文件配置完毕之后,就可以使用如下命令创建这个服务:

# 安装服务
$ jenkins.exe install
Installing service 'Jenkins (jenkins)'...
Service 'Jenkins (jenkins)' was installed successfully.

# 启动服务
$ jenkins.exe start
Service 'Jenkins (jenkins)' was refreshed successfully.
Starting service 'jenkins (jenkins)'...
Service 'jenkins (jenkins)' started successfully.

# 查看服务状态
$ jenkins.exe status
Active (running)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

此时就可以看到服务已经在后台守护中运行了。

当我们执行完 install 之后,在系统中,也可以看到这个服务:

# 4,注意

当我用如上方式启动了 Jenkins 之后,开始构建 unity 包,发现整个打包命令执行没有毛病,但是运行完毕之后,没能正常打出 apk 包,原来是因为这个 Jenkins 服务运行用户的权限问题,此时切换到登陆,使用 administrator 账号密码登陆,然后再重启服务,就能正常打包了。

或者直接在配置文件中添加:

<service>
  <id>jenkins</id>
  <name>Jenkins</name>
  <description>Jenkins Windows Slave Node.</description>
  <executable>java</executable>
  <arguments>-jar C:\tpln-work\pack\agent.jar -jnlpUrl http://jenkins.eryajf.net/computer/windows%2Dunity/jenkins-agent.jnlp -secret 68de6a6f2f5d25b1fa2bd86841a1c4c23958b607d915b1cea046f7c07e40f7a2 -workDir "C:\tpln-work\jenkins"</arguments>
  <serviceaccount>
    <username>administrator</username>
    <password>passwd</password>
    <allowservicelogon>true</allowservicelogon>
  </serviceaccount>
  <logmode>rotate</logmode>
</service>
1
2
3
4
5
6
7
8
9
10
11
12
13

然后基于这个配置进行管理,就可以了。记得把老的 uninstall 下,然后再重新 install 新的配置。

# 5,更多

服务管理的时候,还有更多参数,这里一并整理:

命令 描述
install (opens new window) 安装服务。
uninstall (opens new window) 卸载服务。
start (opens new window) 启动服务。
stop (opens new window) 停止服务。
restart (opens new window) 重启服务。
status (opens new window) 查看服务状态。
refresh (opens new window) 重新加载配置文件。
customize (opens new window) 自定义包装器可执行文件。
dev 实验命令。

还有一些实验性的命令:

命令 描述
dev ps (opens new window) 绘制与服务关联的进程树。
dev kill (opens new window) 如果服务已停止响应,则终止该服务。
dev list (opens new window) 列出由当前可执行文件管理的服务。

每个参数都有对应的文档地址,点击之后可以查看更详细内容。

微信 支付宝
上次更新: 2024/09/26, 21:41:44
批量水印用具配置项
我的Mac应用清单以及系统配置整理

← 批量水印用具配置项 我的Mac应用清单以及系统配置整理→

最近更新
01
记录二五年五一之短暂回归家庭
05-09
02
学习周刊-总第210期-2025年第19周
05-09
03
学习周刊-总第209期-2025年第18周
05-03
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式