惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security Affairs
N
News and Events Feed by Topic
T
Tenable Blog
P
Proofpoint News Feed
W
WeLiveSecurity
Simon Willison's Weblog
Simon Willison's Weblog
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
Help Net Security
Help Net Security
I
Intezer
T
Threat Research - Cisco Blogs
S
Secure Thoughts
C
Cyber Attacks, Cyber Crime and Cyber Security
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
Google Online Security Blog
Google Online Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
The Hacker News
The Hacker News
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Tor Project blog
N
News | PayPal Newsroom
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
A
Arctic Wolf
Forbes - Security
Forbes - Security
O
OpenAI News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Latest
Security Latest
P
Palo Alto Networks Blog
S
Schneier on Security
S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
H
Heimdal Security Blog
V
Vulnerabilities – Threatpost
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
T
Troy Hunt's Blog
Latest news
Latest news
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
L
LINUX DO - 热门话题
M
MIT News - Artificial intelligence
N
Netflix TechBlog - Medium
V
Visual Studio Blog
H
Hacker News: Front Page

二丫讲梵

学习周刊-总第258期-2026年第15周 学习周刊-总第257期-2026年第14周 学习周刊-总第256期-2026年第13周 学习周刊-总第255期-2026年第12周 学习周刊-总第254期-2026年第11周 学习周刊-总第253期-2026年第10周 临时插播一条羊毛,免费领取450元大模型API代金券 学习周刊-总第252期-2026年第09周 学习周刊-总第251期-2026年第08周 学习周刊-总第250期-2026年第07周 学习周刊-总第249期-2026年第06周 诚邀评论,聊聊你所知欲知的我 学习周刊-总第248期-2026年第05周 我的QQ动态之2015年 我的QQ动态之2014年 我的QQ动态之2013年 我的QQ动态之2012年 我的QQ动态-2010-2011年 我的QQ动态-创栏小叙 学习周刊-总第247期-2026年第04周 Nexus社区版权益阉割--一文告诉你有哪些版本可以选择 学习周刊-总第246期-2026年第03周 学习周刊-总第245期-2026年第02周 学习周刊-总第244期-2026年第01周 学习周刊-总第243期-2025年第52周 学习周刊-总第242期-2025年第51周 开源项目ZenOps:带你领略禅意运维 学习周刊-总第241期-2025年第50周 用京东金融,享负债人生 学习周刊-总第240期-2025年第49周 学习周刊-总第239期-2025年第48周 整理我在静态服务透明代理上的极致求索之路,最后一个你绝想不到 学习周刊-总第238期-2025年第47周 我们输了,但收获颇多 太多了,太多了 学习周刊-总第237期-2025年第46周 学习周刊-总第236期-2025年第45周 学习周刊-总第235期-2025年第44周 二五年国庆二三事 学习周刊-总第234期-2025年第43周 学习周刊-总第233期-2025年第42周 学习周刊-总第232期-2025年第41周 学习周刊-总第231期-2025年第40周 学习周刊-总第230期-2025年第39周 西湖毅行 2025年开源世界逸闻三则 学习周刊-总第229期-2025年第38周 手抄《与妻书》 CNB开发与构建基于docker-cache缓存复用的配置实践心得 学习周刊-总第228期-2025年第37周 父亲善行录 学习周刊-总第227期-2025年第36周 带你认识我之看看我的高中同学录(其二) 学习周刊-总第226期-2025年第35周 带你认识我之看看我的高中同学录(其一) 认识神级MCP工具系列--用anyquery和数据库交互 学习周刊-总第225期-2025年第34周 学习周刊-总第224期-2025年第33周 学习周刊-总第223期-2025年第32周 学习周刊-总第222期-2025年第31周 学习周刊-总第221期-2025年第30周 CNB云原生开发环境届的瑞士军刀,详解qifei项目 vuepress-vdoing主题配置自建不蒜子统计 学习周刊-总第220期-2025年第29周 写在博客发表文章1000篇的节点 从claude cli的体验聊聊最大的敌人是我们自己的成见 学习周刊-总第219期-2025年第28周 学习周刊-总第218期-2025年第27周 学习周刊-总第217期-2025年第26周 理论正确,事实错误 学习周刊-总第216期-2025年第25周 学习周刊-总第215期-2025年第24周 学习周刊-总第214期-2025年第23周 学习周刊-总第213期-2025年第22周 学习周刊-总第212期-2025年第21周 从赵心童世锦赛夺冠聊聊我的斯诺克情缘 学习周刊-总第211期-2025年第20周 记录二五年五一之短暂回归家庭 学习周刊-总第210期-2025年第19周 学习周刊-总第209期-2025年第18周 学习周刊-总第208期-2025年第17周 Go开发实践之Gin框架将前端的dist目录embed到二进制 学习周刊-总第207期-2025年第16周 近期关于cobra库的一些实践心得总结 学习周刊-总第206期-2025年第15周 我的嗜好--嗑瓜子 记大宝参加幼儿园组织的清明烈士陵园扫墓活动 学习周刊-总第205期-2025年第14周 学习周刊-总第204期-2025年第13周 前端开发小笔记--在数组中给字段添加值与删除字段的操作 学习周刊-总第203期-2025年第12周 人生实苦,何以自渡 学习周刊-总第202期-2025年第11周 近期发现的一些优秀的工具提名(一) 学习周刊-总第201期-2025年第10周 学习周刊-总第200期-2025年第09周 记一次女友喝醉使我忍术破功 爱情风波--一次分手又复合的经历 学习周刊-总第199期-2025年第08周 整理我的信息源
Windows10利用winsw将应用封装成系统服务后台启动
二丫讲梵 · 2022-11-27 · via 二丫讲梵

# 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 的开源项目来解决这个问题:

- 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) 列出由当前可执行文件管理的服务。

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