步骤/目录:
1.windows下配置开机自动运行
2.linux下配置开机自动运行
    (1)rc.local文件
    (2)update-rc.d与/etc/init.d文件夹
    (3)systemctl与/etc/systemd/system文件夹
附录:在云服务器上设置frps自启动

本文首发于个人博客https://lisper517.top/index.php/archives/4/,转载请注明出处。
本文实验日期2022年2月1日。windows下使用win10笔记本,linux下使用阿里云服务器(系统镜像Ubuntu 20.04)。

1.windows下配置开机自动运行:

win+R打开 运行,输入shell:startup,在该文件夹下新建.bat脚本即可。比如要开机启动redis-server和frpc:

新建redis-server.bat文件,输入:
redis路径\redis-server redis路径\redis.windows.conf并保存。
新建frpc.bat文件,输入:
frp路径\frpc -c frp路径\frpc.ini并保存。
开机后,登录到相应的用户,系统会自动运行该文件夹下的脚本,可以将该文件夹添加快捷方式以方便后续增加自动运行脚本。脚本运行后cmd窗口也一直在,也可以设置隐藏cmd窗口,但不建议。
另外注意,如果要对所有用户设置自启动脚本,可以使用 shell:common startup ,打开的是通用的启动文件夹,就是启动时稍微慢一点;最后,若安装了python,并且默认用python解释器打开.py文件,则启动文件夹里也可以放py脚本。

2.linux下配置开机自动运行:

(1)rc.local文件:

开启rc-local服务后,在/etc目录下可找到rc.local文件,里面可以写一些开机自运行的shell命令(以root权限执行):

nano /etc/rc.local

rc.local文件的框架:

#!/bin/sh
#shell命令
exit 0

添加shell命令时要在exit 0这一行前。比如添加frps自启动:

#!/bin/sh
frp路径/frps -c frp路径/frps.ini
exit 0

有时无法找到rc.local文件,因为rc-local.service未启动。按下面的步骤打开服务:

nano /lib/systemd/system/rc-local.service

在[Service]段后加上:

[Install]
WantedBy=multi-user.target
Alias=rc-local.service

改一下权限

chmod 755 /lib/systemd/system/rc-local.service

然后再创建/etc/rc.local并写入内容,并给rc.local加权限

chmod +x /etc/rc.local

最后添加软链接(或直接systemctl enable rc-local.service

ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/

以后可以一样在rc.local中加自启动命令。
另外有两点,rc.local中也可以添加.sh脚本:脚本路径\脚本名称.sh,需要注意脚本也都需要chmod +x一下;rc.local本质是bash脚本,也是顺序执行的,遇上一些阻塞性的操作,比如上面的frp路径/frps -c frp路径/frps.ini,之后的命令就不会执行了。所以这种方法适合一些快速完成、非阻塞性的操作。

(2)update-rc.d与/etc/init.d文件夹

比如需要开机启动以下脚本:

#!/bin/sh
sudo echo "123" > /bin/123
exit 0

就需要以下操作:

cd /etc/init.d
touch test.sh
chmod +x test.sh
nano test.sh

然后在test.sh中写入刚才的内容,脚本文件就创建好了。这时用service --status-all显示全部服务,就能看到其中一行[ - ] test.sh。使用service test.sh status也能看到test.service状态为inactive。
接着用update-rc.d设置一下开启的优先级:

update-rc.d test.sh start 90

90也可以换成任一两位数,越小表示越先开启。update-rc.d test.sh stop 30同理,越小表示越先关闭。
现在重启,会发现脚本并没有生效(/bin目录下没有123文件)。使用service test.sh start(该命令还会自动运行一次脚本),这时再查看状态,发现变为active,/bin下也有123文件。rm /bin/123后重启,123文件重新出现,证明开机脚本设置成功。

使用update-rc.d添加开机脚本的一般顺序:

cd /etc/init.d
touch 脚本名
chmod +x 脚本名
nano 脚本名 #编辑脚本内容
update-rc.d 脚本名 start NN #NN为两位数,越小表示越先开启
update-rc.d 脚本名 stop NN #NN为两位数,越小表示越先关闭
service 脚本名 enable #允许脚本开机自启动
service 脚本名 start #这时脚本会运行一次

如果要删除脚本,可使用如下操作:

service 脚本名 stop
service 脚本名 disable
update-rc.d -f 脚本名 remove
cd /etc/init.d
rm 脚本名

另外,/etc/init.d/脚本名后接start、stop、status等,也是一样的效果。

(3)systemctl与/etc/systemd/system文件夹

上文中开启rc-local.service就用到了这种方式,这里简单介绍一下。同样,比如有以下脚本需要开机启动:

#!/bin/bash
sudo echo "wuhuqifei" > /bin/123
exit 0

先创建脚本(这里用/bin目录演示)、修改权限:

cd /bin
touch qifei
chmod +x qifei
nano qifei

写入脚本文件后,开始创建service文件:

cd /etc/systemd/system
nano qifei.service

在qifei.service中写入以下内容:

[Unit]
Description=test
Wants=network-online.target
After=network.target network-online.target
Requires=network-online.target

[Service]
ExecStart=bash /bin/qifei
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

解读:[Unit]段是一些基本信息,有描述、依赖项等,其中的Wants、After、Requires意思差不多,都是描述服务依赖哪些项目(在哪些项目后启动),这里意为联网后再开启服务,也可以换成其他service,比如你的脚本依赖于docker.service,需要在docker.service开启后再运行,就可以写Requires=docker.service
[Service]段描述如何开启、关闭服务,开启失败的处理等。这里的5行分别描述了如何开启服务,如何关闭服务,何时重启服务(这里为失败时重启),重启时间,重启间隔。
[Install]段可以写该服务被其他何种服务需要,或者设置别名等。此处是比较通用的写法,大概是开机后就开始运行服务。
脚本和服务文件都创建成功后,使用systemctl status qifei.service查看qifei服务的状态,显示为inactive;systemctl is-enabled qifei.service发现状态为disabled。不需要改为enabled,重启后,发现状态为activating,/bin/123存在,证明服务成功开启。

另外,systemctl start xxx.servicesystemctl stop xxx.service分别可以开启或关闭服务,restart可以重启服务;如果xxx.service修改过了,可以使用systemctl reload xxx.servicesystemctl daemon-reload重新载入一个服务文件或所有服务文件。另外systemctl enable xxx.servicedisableis-enabled分别可以调整和查询服务的enable状态,刚才的例子中qifei.service在disabled时也可开机自启,但为了保险起见还是可以enable一下。

systemctl创建服务的一般操作(脚本放在/bin下为例):

cd /bin
touch test
chmod +x test
nano test #修改脚本内容

脚本内容:

#!/bin/sh #或#!/bin/bash
#需要执行的内容
exit 0

然后创建.service文件:

cd /etc/systemd/system
nano myservice.service

.service文件的一般格式:

[Unit]
Description=service for xxx
Wants=network-online.target #联网后运行
After=network.target network-online.target
Requires=network-online.target

[Service]
ExecStart=bash /bin/test
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

创建完后enable一下,并重启:

systemctl enable myservice.service
reboot

如果服务器在跑其他重要任务、不想重启,就开启一下服务:

systemctl start myservice.service

如果要删除service,可以按如下顺序:

systemctl disable myservice.service
systemctl stop myservice.service
rm /etc/systemd/system/myservice.service
rm /bin/test
#rm /bin/123

最后,要说明三点:systemctl命令和service命令有很多相似之处,二者都可以创建.service文件,这里就不扩展了;不是所有linux发行版的服务文件格式都一样,如openwrt(一般用于路由器)的rc.local使用方法和上文差不多,但其 /etc/init.d/ 目录下 service文件 的格式就不太相同。

附录:在云服务器上设置frps自启动

frp在systemd文件夹中放了.service文件。拷贝到/etc/systemd/system下即可:

cd /bin/frp/systemd
cp frps.service /etc/systemd/system/frps.service

然后打开/etc/systemd/system/frps.service,把其中的User=nobody删掉,ExecStart改一下即可。最后enable+start:

systemctl enable frps.service
systemctl start frps.service #如果已开启frps就别管了

如果/etc/rc.local中写了frps的开启命令,也可以删掉了。

标签: linux, windows

添加新评论