EasyService 是一个只有 16KB 的小程序,它可以让需要长时间运行的 Windows 程序,以系统服务的方式,无窗口后台运行。典型的应用,比如命令行内网穿透 frp 工具、各种 Nodejs、Python 小工具。@Appinn
有很多没有图形界面的程序,会使用 Windows 下的命令提示符界面,看起来…丑丑的,以及很碍事。
而 Windows 并没有一个很方便的后台运行方式,于是,利用系统服务来运行一些程序,就是一种非常优雅的使用方式了。
比如之前小众软件写过的免费开源内网穿透工具 frp 教程。frp 可以让你在不考虑公网 IP 的情况下, 随时从外连接回家,使用 NAS、远程桌面等服务,但 frp 会在桌面留下一个命令提示符。
注意使用 frp 的前提意,需要一个公网 IP 作为中转节点。这个节点可以是拥有固定公网 IP 的任意电脑,也可以自配一台 VPS,青小蛙依旧推荐 Vultr 的机器,便宜好用,控制面板简单。可以另外通过青小蛙的推荐链接注册(👈有返利),还送 50 刀体验金,仅限新用户。Vultr 推荐美国、德国的机器。
如果不嫌麻烦,也可以试试腾讯云的特价服务器,一年只需要 88 元,(推荐注册地址 👈 有返利),优点肯定是连接响应速度快了,但带宽略小。
现在,我们就用 EasyService 把这个命令提示符窗口隐藏起来,让它在后台运行。
EasyService 教程
假设你已经看过 frp 教程,并成功设置了服务器与客户端。下面就用 EasyService 将 frp 的 Windows 客户端窗口隐藏起来。
配置文件
- 下载解压缩 EasyService(19.8KB)
- 将 frp 客户端放到 EasyService 文件夹
- 编辑
svc.conf
文件:
ServiceName: Frp Service
Worker: frpc.exe -c frpc.ini
WorkingDir: frp
OutFileDir: outfiles
WorkerEncoding: utf8
确保此时的 EasyService 文件夹有以下的几个文件和文件夹:
- frp 文件夹(包含配置文件)
- svc.conf
- svc.exe
测试配置文件
然后,在 EasyService 文件夹的地址栏,直接输入 cmd
打开当前文件夹的命令提示符,输入测试命令:
svc.exe check
svc.exe test-worker
如果能看到下面的提示,就证明测试成功,没有问题了。
安装系统服务
此时需要使用管理员权限的命令提示符(在开始菜单中搜索 cmd 然后右键以管理员身份运行)。切换至 EasyService 目录(上图为例 C:\TOOLS\easy-service-master):
cd C:\TOOLS\easy-service-master
svc.exe install
启动系统服务之后,frp 就已经开始运行了,即便用户注销也不会停止运行,且系统开机后、用户登录之前就会自动运行。在服务管理控制台中可以查看已注册的服务。
重启、停止、删除系统服务
只需要运行以下命令,即可:
- svc stop 停止
- svc start 开始
- svc estart 重启
- svc remove 删除
然后,就可以愉快的使用 frp 并且看不见那个烦人的窗口了。EasyService 在 GitHub 开源。
EasyService 原理
EasyService 实质是将自己(svc.exe)注册为一个系统服务,此服务启动时,会读取 svc.conf 中的配置,创建一个子进程运行 Worker 中指定的程序及命令行参数,之后,监视该子进程,如果发现子进程停止运行,会重新启动一个子进程。而当此服务停止时,会向子进程的标准输入中写入数据 “exit” ,并等待子进程退出,如果等待时间超过 10 秒,则直接终止子进程。
多个服务需要运行多个 EasyService。
其他的选择
青小蛙在几个月前还写过一篇通过 nssm 工具实现同样效果的教程:
详见这里:https://meta.appinn.net/t/frp/11319/3
蛙,你那个资源管理器为什么是这样地呀?
https://img3.appinn.net/images/201911/019-11-1414-49-44.jpg
Win10 黑暗模式呀
不是很好用. 推荐CommandTrayHost
CommandTrayHost缺点是只能登录后启动. 不能做成服务
但咱想用这个”以服务方式运行”目标就是让程序在登录前启动,比如目标程序是一个远程桌面连接的…那远程电脑启动(BIOS设置了ac recovery)后还得有人来登录用户再能用等于就没用了呀
登录前启动的, 我是丢计划任务和wsl里面去了.
为啥不花点钱用云盘?
什么云盘?串场了?
AlwaysUp或者FireDaemon比较方便~~~
scv.exe test-worker 错了,是 svc.exe test-worker。
感谢提醒
对于此类需求,建议使用nssm
官网:
https://nssm.cc
用法
https://nssm.cc/usage
Chocolatey 和Scoop都有对应的包
安装nssm官网的说法:
nssm会保证安装的服务失败退出时自动重启,另外会把进程的日志记录到系统event log去。
安装配置服务还有GUI界面,比srvany等强了不是一点半点。
太久不维护啦
看描述就是nssm,只不过后者通过界面配置~友好一点
nssm和Windows Service Wrapper都可以。前者有GUI。两者设置都很详细。
直接
CreateObject(“WScript.Shell”).Run
不是更简单
sc create 更直接吧?也无需额外软件。
事实上,常见的程序中,几乎没有一个能用 sc create 命令注册为系统服务的。你可以试一下 sc create myservice binPath= python 等,看看这个服务能不能正常启动和停止。
要让一个程序能注册为系统服务,需要按微软的服务程序格式编写再编译为可执行文件,具体可以看 https://code.msdn.microsoft.com/windowsapps/CppWindowsService-cacf4948 。
命令行固然好,但不如软件方便,也不便管理。
不过此文做法看上去并不方便。
用 Process Hacker 好啦,轻松方便:
◆将程序运行为服务:
Hacker菜单:Run as
wj32.org/processhacker/forums/viewtopic.php?t=599
◆创建服务:
Tools菜单:Create service
而且 Process Hacker 作为强大的任务管理器,调整/监视/管理(进程/服务/…)全包了。
担心消耗?运行起来自己看!
这么多回复怎么没人提 WinSW?按理说这个应该很知名才对,GitHub标星 3.3k
这个EasyService对比WinSW配置起来也没简单
我在论坛推过,没有什么反响。
之前我那个 Aria2 超·懒人包就是基于 WinSW
nssm 年老失修,还有缺陷,该弃了
我也用的WinSW..也见别人给青蛙推荐过几次..但总是被忘好像..😂
vultr 的ip被封的七七八八了,,,,。。。。哭唧唧,,,
EasyService 相对于 nssm 这些 GUI 软件的好处一个是体积小,一个是可以用简单的 svc restart 等命令对服务进行管理。配合目前 Windows 下的 openssh ,可以直接远程 ssh 到服务器进行网站代码更新和服务重启等操作(而不必远程登录到服务器桌面),使用起来还是很方便的。
我是 EasyService 的作者, EasyService 是我在工作过程中管理 Windows 服务器时编写的一个小工具,希望这个小工具能给大家带来便利 ^_^
如果只是需要隐藏一个命令行的窗口的话可以用vbs脚本。
以运行frpc为例,新建一个frpc.vbs,然后记事本打开,写入
CreateObject(“WScript.Shell”).Run “frpc -c frpc.ini”,0
然后保存,点击运行就可以了,后面冒号里的内容可以自行替换
如果是pc的话,新建个桌面放进去就好了,设置里把任务栏共享关掉就看不到了。
“设置里把任务栏共享关掉就看不到了”这是怎么操作的?
RunAsSvc,用了很久了
不知道还有没有人会说 winsetstate(“”,“”,@SW_HIDE) (尴尬~~)
终于有我的用武之地了^v^
隐藏窗口的好工具,minime
可以将任意窗口最小化到托盘【托盘只会有minime一个图标哦~】
可以设置全局快捷键,很简洁,几十kb而已。
效果截图:
https://v1.513902.xyz:30443/chfs/shared/public/img/1576205161(1).jpg
对了,支持XP,win10也没问题。
你说的是这个吧,好古老的软件呀,再次感叹微软的兼容性之高。
https://www.appinn.com/minime/
对的,就是这个,感觉挺好用的,特别是支持XP和快捷键隐藏。
【ps:不支持有没有软件在这个的基础上,附件功能:比如minime开机自启,然后就能带动启动frp并最小化窗口】
用服务实现不如直接用任务计划程序,登陆时或者启动时触发,安全选项选择非当前使用账户+不管用户是否登录都要运行就行了。
PS,需要长时间运行的程序记得在设置里反选如果任务运行超过以下时间,停止任务的选项。
你有没有考虑过依赖问题?
虽说服务的特权是一部分。
但服务更重要的是要处理依赖。