[每周一更]-(第28期):Windows服务自启动设置

在这里插入图片描述

需求:有时候有些软件,想在开机后自启动,但是由于屏幕需要录入密码,但是普通开机启动的应用,需要在录入密码进去Windows界面才能启动,但是
不用解锁屏幕但需要运行的应用还是有的,比如一些软件远程服务软件,那么这篇文章就能解决此类问题;

解决:通过将软件注册为Windows的服务,那么在开机后即可跟操作系统一样一起启动,具体细节如下:

一、Windows自带的sc命令

0、进去windows的cmd,windows+R-》cmd 使用管理员账户打开

1、注册bat服务或exe服务(bat针对内容语言强规则要求)
sc create Frpc binpath= "C:/frp/startfrpc.bat" start= demand displayname= "frpc" //手动
sc create Frpc binpath= C:/frp/startfrpc.bat start= auto displayname= "frpc"     //自动
sc create frpc binpath= D:/frps/frp/frpc.exe start= auto displayname= "frpc"

2、net start frpc

3、任务管理器->服务->找到frpc

4、命令行进入服务列表:windows+R -> services.msc

5、列出所有服务: 	sc queryex type=service state=all

6、删除具体的服务:  sc delete frpc

由于有些权限限制,该操作为报错:错误1053:服务没有及时形影启动或控制请求,暂未解决,遂采用如下nssm来封装服务

二、使用NSSM将exe封装为服务

NSSM 是一个Windows的服务管理器,以安装客户端frpc为例子
在这里插入图片描述

NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行。同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大。它的特点如下:

  • 支持普通exe程序(控制台程序或者带界面的Windows程序都可以)
  • 安装简单,修改方便
  • 可以重定向输出(并且支持Rotation)
  • 可以自动守护封装了的服务,程序挂掉了后可以自动重启
  • 可以自定义环境变量

这里面的每一个功能都非常实用,使用NSSM来封装服务可以大大简化我们的开发流程了。

  • 开发的时候是一个普通程序,降低了开发难度,调试起来非常方便
  • 安装简单,并且可以随时修改服务属性,更新也更加方便
  • 可以利用控制台输出直接实现一个简单的日志系统
  • 不用考虑再加一个服务实现服务守护功能
    我觉得它还可以需要增加的一个功能是将输入输出重定向为一个tcp连接,这样可以通过telnet的方式实现程序的交互了,那样就更加好用了。

下载地址:https://nssm.cc/download
教程:https://clear-jackrabbit-ac2.notion.site/Windows-Service-9a7e939012dd4f04a0998090e3e58b04

服务管理:
服务管理主要有启动、停止和重启,其命令如下:
    启动服务:nssm start <servicename>
    停止服务:nssm stop <servicename>
    重启服务: nssm restart <servicename>
当然,也可以使用系统自带的服务管理器操作和使用系统的命令。

修改参数:
NSSM安装的服务修改起来非常方便,命令如下:
    nssm edit <servicename>
会自动启动操作界面,直接更改即可。

服务删除:
服务删除可以使用如下命令之一:
    nssm remove <servicename>
    nssm remove <servicename> confirm
功能没有大的区别,后面的命令是自动确认的,没有交互界面。


1、安装,名称frpc
    nssm install frpc
2、卸载
    nssm remove frpc
3、查询状态
    nssm status frpc
4、重启
    nssm restart frpc

问题汇总

1、nssm 启动frpc ,在开机自启动服务失败

如果您使用了 NSSM 来创建 Windows 服务并将其设置为开机自启动,但服务无法在系统启动时自动启动,则可能是以下原因导致:

  • 用户权限问题:如果您在创建服务时使用了受限制的用户帐户,例如本地用户帐户,服务可能无法在系统启动时以该用户身份启动。尝试在创建服务时使用管理员权限运行 NSSM 并将服务设置为 LocalSystem 帐户,这样它将以系统权限运行并在系统启动时自动启动。
  • 依赖项问题:如果您的服务依赖于其他服务或程序,但这些依赖项无法在系统启动时可用,则您的服务可能无法启动。尝试将服务的启动类型设置为“自动(延迟启动)”,这将在系统启动后一段时间后启动服务,以便它可以等待所需的依赖项可用。
  • NSSM 配置问题:您的 NSSM 配置可能有误。尝试检查 NSSM 配置文件中的参数和路径是否正确,并确保它们指向正确的可执行文件和服务路径。
  • 系统问题:在某些情况下,系统问题可能会导致服务无法在启动时启动。尝试重启系统并检查系统日志以查看是否有与服务启动相关的错误信息。

如果您仍然无法解决问题,请尝试使用其他工具来创建和管理 Windows 服务,例如 Windows 自带的 sc.exe 命令行工具或第三方工具。

2、怎么将服务设置为 LocalSystem 帐户

您可以按照以下步骤将 NSSM 创建的服务设置为 LocalSystem 帐户:

  • 打开命令提示符或 PowerShell,并使用管理员权限运行。
  • 使用 nssm.exe install 命令安装您的服务。例如,nssm.exe install MyService。
  • 打开服务管理器,找到您刚刚创建的服务,并右键单击它。
  • 选择“属性”,然后切换到“登录”选项卡。
  • 选择“此账户”,并输入“NT AUTHORITY\LocalSystem”作为帐户名称。
  • 留空密码和确认密码字段。
  • 单击“应用”并关闭服务属性窗口。

现在,您的服务将使用 LocalSystem 帐户身份运行,并且应该在系统启动时自动启动。请注意,LocalSystem 帐户是具有最高权限的帐户之一,因此请确保您的服务不会以危险的方式使用这些权限。

三、任务计划

在 Windows 电脑中,有一个【计划任务程序】,很少被用到,然而,对于高效人士来说,它具有很多的妙用,比如自动清理回收站、自动开关软件、自动批量处理文件等等。

四、winsw

类似于nssm的注册服务的工具
https://github.com/winsw/winsw/releases

直接到想要注册为服务的软件根目录下运行如下:

//注册服务
winsw.exe install
//卸载服务
winsw.exe uninstall
//启动服务
winsw.exe start
//停止服务
winsw.exe stop
//重启服务
winsw.exe restart
//查看状态
winsw.exe status

五、其他一些关机的操作

windows 批处理bat,设置定时关机:

https://segmentfault.com/a/1190000017189422?utm_source=sf-similar-article

意外断电后重新来电时自动开机

在主板BIOS中有一个“Power Management Setup(电源管理设置)”中,有个“POWER ON AFTER PWFAIL”或“pwron after pw-fail”设置项,

其选项有三,分别为“On(开机)”、“Off(关机)”和“Former-Sts(恢复到到断电前状态)”,将此选项设置为 “On”,当你的电脑意外断电后重新接通电源时电脑就会自动开机。

根据BIOS版本和主板的不同,此项设置也会有所不同,具体请参见主板说明书。但建议大家最好还是将此选项设置为“Off”,不要用此功能自动开机。

因为这种功能极其不稳定,所以它很可能导致在正常断电情况下,一接通电源电脑就自动开机;或是打开插线板开关时,也有可能会使电脑自动开机。因此对主板会有所损害。

<think>好的,用户需要设定个cron表达式,让程序在每周至周五的8:45到11:30,以及14:00到17:30运行。首先,我得分解下时间要求。 首先看上午时段:8:45到11:30。结束时间是11:30,所以需要覆盖从8点45分开始,到11点30分结束,每小时内的具体分钟。同样,下午时段是14:00到17:30,也就是下午2点到5点30分。 接下来,分析cron表达式的时间字段。cron有五个时间字段:分钟、小时、日、月、星。用户需要每周至周五,所以星字段是1-5。 对于分钟部分,这两个时段都是每小时从00分开始到30分结束吗?不对,用户的需求是程序在8:45开始,到11:30结束,下午14:00到17:30。所以上午时段的具体时间应该是每个工作日的8点45分开始,之后每隔定时间执行,或者需要覆盖从8:45到11:30之间的每个分钟? 这里可能需要明确用户的需求是程序在那些时间段内持续运行,还是需要在每个时间段内的特定时间点启动。通常,cron用于定时启动任务,如果用户希望程序在时间段内持续运行,可能需要结合其他机制,比如在cron启动后保持程序运行直到结束时间。但假设用户只是希望程序在这些时间段内的每个小时中的特定分钟执行,或者需要每个小时内的某些时间点执行。 不过,常见的情况是,用户可能希望程序在每个工作日的这两个时间段内,每分钟都执行次。但这样会导致任务每分钟都启动,可能不太合理。因此,可能用户是希望程序在这两个时间段内保持运行,但cron本身并不能保持程序运行,只能定时启动。因此,可能需要设定程序在每天的8:45启动,并在11:30停止,下午2点启动,5:30停止。但停止的话,cron无法直接处理,可能需要配合脚本,比如启动时记录PID,然后在停止时间用另个cron任务kill掉进程。 不过用户的问题可能只是需要程序在指定的时间段内每分钟运行次,或者每隔定时间运行次。但用户的问题描述是“启动程序”,可能是指在这些时间段内,程序需要被定时触发,比如每分钟执行次,或者在特定时间点执行。这需要进步明确,但根据常规理解,可能用户希望程序在这些时间段内持续运行,所以需要设置启动时间,但如何停止呢? 可能用户的需求是程序在每周至周五的这两个时间段内运行,即当系统时间进入8:45-11:30和14:00-17:30时,程序需要启动。但cron只能设置开始时间,无法直接设置持续时间。因此,可能需要将这两个时间段拆分为多个cron条目,每个条目对应每个小时内的特定分钟。 例如,上午8:45到8:59,每分钟执行;9点到10点,每小时从00分到59分执行;11点到11:30,每分钟执行。同样下午14:00到17:30,每个小时内的每分钟执行。但这样写的话,表达式会非常复杂,因为需要处理不同小时的不同分钟范围。 或者,用户可能希望程序在每天的这两个时间段内,每分钟都执行次任务。这种情况下,cron表达式需要覆盖这些分钟。 现在,分开处理上午和下午两个时间段: 对于上午时段(周至周五8:45-11:30): - 分钟部分:从45到59(8点),然后从0到59(9点、10点),然后从0到30(11点)。因此,分钟字段需要覆盖45-59和0-30,但小时字段是8-11。不过,这样无法直接表达,因为当小时是8时,分钟是45-59;当小时是9或10时,分钟是0-59;当小时是11时,分钟是0-30。这可能需要多个表达式。 同样,下午时段(14:00-17:30): - 分钟部分:0-59(14、15、16点),然后0-30(17点)。因此,小时是14-17,分钟是0-59,但17点时分钟是0-30。 因此,需要为每个时间段拆分成多个cron表达式: 上午时段: 1. 8点45分到8点59分:分钟45-59,小时8,周1-5 2. 9点到10点:分钟 0-59,小时9-10,周1-5 3. 11点0分到11点30分:分钟0-30,小时11,周1-5 下午时段: 1. 14点到16点:分钟0-59,小时14-16,周1-5 2. 17点0分到17点30分:分钟0-30,小时17,周1-5 因此,总共有5个cron表达式: 对于上午: - 45-59 8 * * 1-5 - 0-59 9-10 * * 1-5 - 0-30 11 * * 1-5 下午: - 0-59 14-16 * * 1-5 - 0-30 17 * * 1-5 但cron表达式不支持范围如45-59这样的分钟范围,而是需要用逗号分隔或者步长?其实,cron支持范围,如分钟字段45-59表示45到59之间的每分钟。 因此,合并后的表达式应该是: 对于上午的三个部分: 1. 45-59 8 * * 1-5 2. * 9-10 * * 1-5 (分钟为*表示每小时的所有分钟) 3. 0-30 11 * * 1-5 同样,下午的两个部分: 4. * 14-16 * * 1-5 5. 0-30 17 * * 1-5 因此,用户需要设置五个cron任务,或者将它们合并为多个表达式。但cron每个表达式只能有个范围,无法在个表达式中同时处理不同的分钟范围。例如,无法在个表达式中同时处理8点的45-59和其他小时的分钟范围。因此,必须拆分成多个表达式。 所以最终的cron表达式应为: 对于上午: 45-59 8 * * 1-5 * 9-10 * * 1-5 0-30 11 * * 1-5 下午: * 14-16 * * 1-5 0-30 17 * * 1-5 这样总共有五个表达式。但用户可能希望用尽可能少的表达式。有没有办法合并某些部分? 比如,上午的9-10点和下午的14-16点,这两个时段都是整个小时内的每分钟执行,所以可以表示为: 对于上午9-10点:* 9-10 * * 1-5 下午14-16点:* 14-16 * * 1-5 而上午8点45-59和11点0-30,以及下午17点0-30则需要单独的表达式。 因此,总共需要5个cron表达式。但用户可能希望简洁的方式,或者可能接受多个表达式。 不过,是否有可能使用复杂的分钟范围?例如,对于上午8点,分钟是45-59,而其他小时(9-10)是0-59,11点是0-30。这可能需要多个表达式,因为分钟范围在小时变化时不同。 另个方法是使用多个表达式来覆盖每个小时的不同分钟范围。例如: 对于周至周五: 1. 45-59 8 * * 1-5 2. 0-59 9-10 * * 1-5 3. 0-30 11 * * 1-5 4. 0-59 14-16 * * 1-5 5. 0-30 17 * * 1-5 这样五个表达式可以满足所有时间段的需求。因此,用户需要设置这五个cron任务。 但用户可能希望简洁的表达方式,或者是否有办法合并某些表达式? 例如,上午的8:45-59和11:00-30是否可以合并?可能不行,因为小时不同,分钟范围不同。 因此,正确的答案是必须使用五个独立的cron表达式。但有些情况下,可以通过使用逗号或步长来合并,但这里似乎不行。 不过,可能用户希望程序在每个工作日的这两个时间段内每分钟都运行次,那么正确的cron表达式就是上述五个。 现在,验证每个表达式是否正确: 例如,第个表达式45-59 8 * * 1-5:每周至周五的8点45分到59分,每分钟执行。 第二个表达式* 9-10 * * 1-5:周至周五的9点到10点,每分钟执行。 第三个表达式0-30 11 * * 1-5:周至周五的11点0分到30分,每分钟执行。 下午部分: 第四个表达式* 14-16 * * 1-5:周至周五的14点到16点,每分钟执行。 第五个表达式0-30 17 * * 1-5:周至周五的17点0分到30分,每分钟执行。 这样组合起来,覆盖了用户所需的所有时间段。 因此,最终的答案应该是这五个cron表达式。但用户可能希望用尽可能少的表达式,或者是否有其他方式? 或者,是否有简洁的方式?比如,使用多个分钟范围? 例如,对于上午8点到11点30分,是否可以写成: 分钟:45-59(当小时=8),0-59(当小时=9-10),0-30(当小时=11) 但cron表达式不支持条件判断,因此无法在个表达式中处理这种情况。必须拆分成多个表达式。 因此,必须使用五个独立的cron表达式。</think>需要为您的需求创建两个独立的cron表达式,分别对应上午和下午时间段: $\textcircled{1}$ 上午时段(周至周五8:45-11:30) ```bash 45-59 8 * * 1-5 * 9-10 * * 1-5 0-30 11 * * 1-5 ``` $\textcircled{2}$ 下午时段(周至周五14:00-17:30) ```bash 0-59 14-16 * * 1-5 0-30 17 * * 1-5 ``` $\boxed{\text{分段实现原理}}$ 1. **分钟精度**:cron最小时间单位为分钟 2. **时段拆分**: - 8:45-8:59 → `45-59`分钟 + `8`时 - 9:00-10:59 → 全分钟(`*`) + `9-10`时 - 11:00-11:30 → `0-30`分钟 + `11`时 - 14:00-16:59 → 全分钟(`*`) + `14-16`时 - 17:00-17:30 → `0-30`分钟 + `17`时 $\boxed{\text{验证方法}}$ ```bash # 查看生效时间(以上午第条为例) $ crontab -l 45-59 8 * * 1-5 /path/to/your_script.sh # 使用测试工具验证 $ cronchecker "45-59 8 * * 1-5" 将会显示未来5次触发时间(应为每周至周五的8:45-8:59每分钟) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ifanatic

觉得对您有用,可以友情打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值