服务启动失败_将控制台程序转换为服务运行
移花接木
在上一篇文章《限制程序只能同时启动一个实例-唯一》中,我们详细讨论了在Windows中,将软件设置为开机启动的方法。从而实现保护程序开机的时候自动保护服务的运行。
有的时候,我们没有某个控制台程序的源代码,但是我们需要一直运行这个控制台程序。而且这个控制台程序是静默运行的,不需要用户参与任何交互。
比如我们需要用到其提供的某些功能,并且不能停止运行。
这个时候,如果我们以控制台的形式启动这个程序,会有两个问题:
- 控制台窗口,容易被关掉
- 如果不小心选中了控制台里面的内容,程序会暂停运行
那如何解决这个问题呢?
编写简单的控制台程序
先来创建一个C#控制台项目:
创建项目
我们就用上次的保护进程的逻辑代码,来演示控制台程序转服务。
控制台程序代码如下:
程序代码
经过外老师测试,控制台程序内部,不管是不是使用了后台线程,都不影响转服务。只要控制台程序在运行即可。采用后台线程运行的时候,通过Console.ReadKey类似的方式,保持程序持续运行即可。
同样,因为我们这个控制台程序需要启动服务,所以也需要管理员权限。我们在项目的【属性】中,在【安全性】选项卡里面,启用【Click Once 安全设置】,再关闭【Click Once 安全设置】,最后修改其配置文件【app.manifest】:
请求管理员权限
这样我们的程序启动之后,就可以启动服务了。
我们编译程序,然后直接运行,检验一下是否可以正常守护服务:
正常启动
然后结束掉服务进程,看进程能否重启:
检验保护效果
经过外老师测试,功能正常。那么我们的控制台程序就写好了。
控制台转服务
现在来想办法将上面的控制台程序转换为服务运行。外老师尝试了3种办法,最后才成功:
- sc create 直接创建服务
- 使用srvany来转换
- 使用一个开源项目RunAsService来转换
前面两种,最终未能成功,但是第三种,终于成功了。前面两种失败的过程,在后面的踩坑记录里面简单介绍,这里我们重点介绍第三种!
由于第二种svrany是比较常用的方法,但是经过我一番尝试,最终失败。
无奈只好求助于程序员的万能朋友圈github,最后找到一个项目【RunAsService】,经过尝试,最后终于成功!
RunAsService
将这个仓库克隆下来,然后编译,然后研究了一下其运行方式:
RunAsService也需要先以服务的形式运行起来:
安装RunAsService服务
然后在【RunAsService.xml】中配置需要转换为服务的控制台程序:
配置程序
其中的【CmdLine】为最重要的控制台程序启动命令。再配置好服务的描述和启动方式。然后就可以启动【RunAsService】服务来启动这里配置的控制台程序了:
启动RunAsService
然后我们再测试,是否能够保护服务:
保护测试
测试结果正常,结束掉进程【TestService】之后,迅速重启。
这里外老师还发现一个小惊喜,就是【RunAsService】本身,也具备保护进程的效果。它可以保护【TestConsole】这个控制台程序。
不得不说【RunAsService】功能还是蛮强大的。后面有机会,给大家分享一下其源代码,探索一下其背后的深层原理。
踩坑记录
刚开始尝试了网上的一种办法,使用 sc create 来创建服务:
sc create SvcProtectorConsole binpath= F:WeMedia01付费专栏C#-Windows服务全面开发win-serviceSrcTestServiceTestConsolebinDebugTestConsole.exe type= own start= auto displayname= SvcProtectorCsl
但是经过测试,这种方法,只适用于以服务的形式编写的程序,对于普通的控制台程序,并不适用。
普通程序,在启动服务的时候会报错。
当然不排除有解决的办法,但是目前外老师还没找到方法。
srvany尝试失败,目前原因未知
参考:https://wangye.org/blog/archives/42/
下期预告
RunAsService背后的原理
敬请期待。。。
下一篇文章《控制台转服务背后的秘诀》,欢迎检阅!
服务启动失败_将控制台程序转换为服务运行相关推荐
- sqlserver服务启动失败_条码打印软件连接SQL数据库出现TCP连接失败解决办法
小编今天用条码打印软件连接SQL 数据库遇到了一个问题:通过端口1433连接到主机localhost的TCP/IP连接失败.错误:"Connection refused:connect.请验 ...
- centos7.4 mysql启动,centos7下mysql服务启动失败_网站服务器运行维护,centos7,mysql
centos7系统启动流程_网站服务器运行维护 centos7系统启动流程:1.POST加电自检:2.选择启动设备以加载MBR:3.加载bootloader:4.Kernel自身初始化:5.init管 ...
- linux下rip服务启动失败,RIP协议_linux系统管理与服务的技术博客_51CTO博客
理解并配置动态路由协议RIP RIP(Routing Information Protocol)是应用较早.使用较普遍的内部网关协议(Interior Gateway Protocol,IGP),适用 ...
- linux系统mysql服务启动失败
查看mysql.sock文件,如忘记了文件位置,则查看/etc/my.cnf文件. 查看mysql.sock文件是否存在 若不存在 1.service mysqld stop (停止服务) 2.rm ...
- mysql star item 失败_解决CentOS7下MySQL服务启动失败的问题.md
--- title: 解决CentOs7下MySQL服务启动失败的问题 date: 2021-01-06 15:21:31 tags: MySQL --- 老夫前几天才在虚拟机的CentOS安装好My ...
- eas报错日记_(FAQ)EAS服务启动失败[金蝶EAS]
[问题]: (FAQ)EAS服务启动失败 版本: 6.0 模块: 系统部署 [答复]: 原因分析: 日志都是两周前的日志,显示都是SQLServer的数据库网络端口没有打开相关报错. 经沟通得知当前已 ...
- 一刀斩 :“SVN” failed to start 服务启动失败
最近需要使用SVN,在安装过程中遇到了一个坑爹的问题.分享一下,以免你们也被雷到. [ "SVN" failed to start 服务启动失败:] 按照正常的软件安装过程:打 ...
- windows服务启动失败解决流程
最近遇到windows服务启动失败的情况,网上查阅了一下相关的解决方式,顺便记录一下解决的一般流程和方式: (一般是软件的配置文件出现问题,先检查配置文件是否有问题,例如没有符合yml格式(不可使用t ...
- Linux系统下SSH服务启动失败故障处理
Linux系统下SSH服务启动失败故障处理 一.系统版本 二.报错状态 三.处理方法 四.查看服务状态 一.系统版本 [root@localhost ~]# cat /etc/os-release N ...
最新文章
- 计算机组成原理ppt免费,计算机组成原理(白中英)第二章1.ppt
- 深度学习 正则化 正则化率_何时以及如何在深度学习中使用正则化
- ASP.NET(c#)常用类函数
- P2350-[HAOI2012]外星人【线性筛】
- grumble.js--气泡形状的提示(Tooltip)控件
- 【华为云技术分享】《跟唐老师学习云网络》 - TUN/TAP网线
- Windows Restart Manager 重启管理器
- Palindrome Degree(hash的思想题)
- 计算机开题报告参考文献,开题报告中参考文献.docx
- 解决AXURE RP EXTENSION FOR CHROME的快捷方法
- prewitt算子实现
- HTML5--植物大战僵尸网页版
- 新手小白如何选择吉他,初学者的入门吉他推荐
- 为什么我会感到迷茫? 文/江湖一剑客
- 导致Android手机崩溃的壁纸,一张壁纸导致安卓手机崩溃作者首发声:绝非故意...
- C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)
- Excel PivotTable 使用心得手顺分享(六)
- Python爬取人民网夜读文案
- 笔记本无线网卡天线接线柱掉了(AUX和MAIN两个接口)
- 【硬件】Z7_DDR_pcb layout(纯干货,建议收藏)
热门文章
- JavaScript 败北,TypeScript 大势所趋?
- 字节跳动自研重度游戏;中国移动前董事长谈飞信失败;Linux 5.3-rc3 发布 | 极客头条...
- 性能提升 3 倍的树莓派 4,被爆设计缺陷!
- 量子计算时代到来,摩尔定律将要失效?
- 谷歌中国 AI 中心要凉?李飞飞否认将离职
- 成为一名架构师得学习哪些知识?
- 阿尔法狗 3 天走完人类千年棋史,被反超的我们该如何绝地求生?34 个开源项目告诉你!
- Java实例方法和类方法的区别
- “金三银四”春招指南!在线javascript
- java导_java——导入功能