场景
电脑或服务器开机都会有一些需要启动的程序,每次都需要一个一个点击启动,耗时耗力,还有可能漏启动。所以添加一个开机自启的脚本,脚本中帮我们打开需要启动的程序,如Snipaste、FRP客户端等。
CentOS
方式一:添加启动命令到rc.local文件中
修改 /etc/rc.local 文件,添加启动服务的命令
先写好启动脚本或者启动命令,事先保证启动脚本或命令能正常启动服务,然后将脚本路径或启动命令添加至/etc/rc.local文件中,这个方法适合比较简单的shell脚本。
方式二:注册服务并设置开机自启
创建脚本myservice,写入
#!/bin/bash
# chkconfig: 234 10 90
# description: myservice ...
case $1 in
"start")
date >> /tmp/test.txt
echo "service start" >> /tmp/test.txt
;;
"stop")
date >> /tmp/test.txt
echo "service stop" >> /tmp/test.txt
;;
esac
NOTE:其中2345是默认启动级别,级别有0-6共7个级别。
- 等级0表示:表示关机
- 等级1表示:单用户模式
- 等级2表示:无网络连接的多用户命令行模式
- 等级3表示:有网络连接的多用户命令行模式
- 等级4表示:不可用
- 等级5表示:带图形界面的多用户模式
- 等级6表示:重新启动
- 10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。
将脚本放到/etc/init.d或/etc/rc.d/init.d目录下,并添加脚本为服务
chkconfig --add myservice
NOTE:此时调用chkconfig --list myservice命令,得到如下启动等级
myservice 0:off 1:off 2:on 3:on 4:on 5:on 6:off
输入如下命令调用myservice服务,然后查看/tmp下的test.txt文件发现已经写入了日期。
systemctl start myservice
NOTE:对服务的操作就相当于在调用对应的脚本
service httpd 等价 /etc/rc.d/init.d/httpd
service httpd start 等价 /etc/rc.d/init.d/httpd start
service httpd stop 等价 /etc/rc.d/init.d/httpd stop
systemctl start myservice 等价 /etc/rc.d/init.d/myservice start
将myservice服务设置为开机自启
systemctl enable myservice
NOTE:如果启动等级是2345,则已经是开机自启了,可以省略这步。
查看服务是否开机启动
systemctl is-enabled myservice
重启服务器,就会执行systemctl start myservice
命令和rc.local
中的命令。
方式三
编辑脚本
[Unit]
Description=node_export
Documentation=https://github.com/prometheus/node_exporter
After=network.target
Wants=network.target
[Service]
Type=simple
User=hxr
ExecStart= /opt/module/node_exporter-1.2.2/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
配置中多个相同配置会选择最后一个;所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。EnvironmentFile=-/etc/sysconfig/sshd,表示即使 /etc/sysconfig/sshd 文件不存在,也不会抛出错误
[Unit] 启动顺序与依赖关系:
Description:当前服务的简单描述;
Documentation:指定 man 文档位置;
After:如果network.target 需要启动,那么 sshd.service 应该在它们之后启动;
Before:定义 本服务 应该在哪些服务之前启动。After 和 Before 字段只涉及启动顺序,不涉及依赖关系;
Wants:表示 network.target 之间存在"弱依赖"关系,即如果"network.target"启动失败或停止运行,不影响 本服务 继续执行;
Requires:表示"强依赖"关系,即如果该服务启动失败或异常退出,那么 本服务 也必须退出 。 Wants 字段与Requires 字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动。[Service] 启动行为:
EnvironmentFile:许多软件都有自己的环境参数文件,该字段指定文件路径(注意:/etc/profile 或者 /etc/profile.d/ 这些文件中配置的环境变量仅对通过 pam 登录的用户生效,而 systemd 是不读这些配置的。systemd 是所有进程的父进程或祖先进程,它的环境变量会被所有的子进程所继承,如果需要给 systemd 配置默认参数可以在/etc/systemd/system.conf 和 /etc/systemd/user.conf 中设置。 加载优先级system.conf 最低,可能会被其他的覆盖);
Type:定义启动类型。可设置:simple,exec,forking,oneshot,dbus,notify,idle。
simple(设置了 ExecStart= 但未设置 BusName= 时的默认值):ExecStart 字段启动的进程为该服务的主进程
forking:ExecStart 字段的命令将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程。
ExecStart:定义启动进程时执行的命令 上面的例子中,启动 sshd 执行的命令是 /usr/sbin/sshd -D $OPTIONS,其中的变量 $OPTIONS 就来自 EnvironmentFile 字段指定的环境参数文件。
ExecReload:重启服务时执行的命令 ExecStop:停止服务时执行的命令 ;
ExecStartPre:启动服务之前执行的命令;
ExecStartPost:启动服务之后执行的命令 ExecStopPost:停止服务之后执行的命令;
RemainAfterExit:设为yes,表示进程退出以后,服务仍然保持执行;
KillMode:定义 Systemd 如何停止服务,可以设置的值如下:
control-group(默认值):当前控制组里面的所有子进程,都会被杀掉 process:只杀主进程 mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 none:没有进程会被杀掉,只是执行服务的 stop 命令;
Restart:定义了退出后,Systemd 的重启方式。可以设置的值如下: no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启 on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启 on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启;
RestartSec:表示 Systemd 重启服务之前,需要等待的秒数[Install]启动行为:
WantedBy:表示该服务所在的 Target(服务组) 。关于 Target,运行级别结果为 multi-user.target,表示默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。这就是为什么 systemctl enable
命令能设置开机启动的原因。shutdown.target 就是关机状态。常用的 Target 有两个:一个是 multi-user.target,表示多用户命令行状态;另一个是 graphical.target,表示图形用户状态,它依赖于 multi-user.target systemctl isolate shutdown.target。
根据实际情况修改Service中的User和ExecStart的属性,然后将将本放到 /usr/lib/systemd/system/node_exporter.service
路径下。
设为开机自启动
systemctl enable node_exporter.service
会将文件路由到 /etc/systemd/system/multi-user.target.wants/ 目录下
可以通过如下命令查看日志信息
journalctl -u node_exporter -n 10 -f
Windows
- 创建.bat脚本,输入启动命令
start /min C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.exe -c C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.ini
start E:\Snipaste\Snipaste.exe
start "" "C:\Program Files (x86)\iNode\iNode Client\iNode Client.exe"
- 将脚本放到系统启动文件夹C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup中(或在运行框中输入shell:startup打开用户启动文件夹C:\Users\CJ\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)
NOTE:frpc.exe启动时会打开cmd窗口,可以加上/min来最小化cmd窗口。
NOTE:Win中没有linux中的nohup(忽略SIGHUP指令)和&(忽略SIGINT指令)命令来挂起程序使其在后台运行,如果希望其在后台运行,可以隐藏窗口。
网上找了以下两种方式,但是都不管用╯﹏╰
方式一:@echo off if "%1" == "h" goto begin mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit :begin start /min >C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.exe -c >C:\Users\Administrator\Desktop\frp_0.36.2_windows_amd64\frpc.ini start E:\Snipaste\Snipaste.exe
方式二:
再写一个vbs文件,在该文件中以隐藏的方式启动bat脚本Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c start.bat",vbhide