我们在使用Linux系统的时候,经常遇到的一个需求就是需要开机运行命令(或者脚本),本文就以在debian11上开机运行tailscale中继服务器DERP为例,总结一下最常用的3种开机运行命令(或者脚本)的方式。
#以service的方式添加
这是debian推荐的添加开机启动脚本的方式,把开机项注册为service,也方便管理和运维。
我们来看定义service文件的格式,以我配置DERP服务(参见:在云主机上搭建tailscale DERP server(中继服务器))的service为例:
[Unit]
Description=derper.service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/go/bin/runderper
ExecStop=/usr/local/go/bin/stopderper
[Install]
WantedBy=multi-user.target
因为注册为服务后,可以使用systemctl start
和systemctl stop
等命令进行管理,所以在service文件中需要提前定义好start和stop对应的行为,一般这里我们可以写2个脚本分别来对应,在DERP的例子中,ExecStart=
后面的脚本/usr/local/go/bin/runderper
就对应start;ExecStop=
后面的脚本/usr/local/go/bin/stopderper
对应stop。其中start必须要有,stop则不一定,如果大家没需求可以不定义这个。
先创建runderper脚本:
vim /usr/local/go/bin/runderper
粘贴如下内容并保存退出:
#!/bin/sh
cd /root/go/bin
nohup ./derper -hostname=ab.cd.ef -c=derper.conf -a=:45678 -http-port -1 -certdir=/usr/local/cert -certmode=manual -verify-clients -stun & echo $! > /usr/local/go/bin/app.pid
derper程序的路径,域名,端口,证书存放路径以及app.pid的路径,大家根据自己的实际情况进行修改。
然后创建stopderper脚本:
vim /usr/local/go/bin/stopderper
粘贴如下内容并保存退出:
#!/bin/sh
kill cat app.pid
rm -rf app.pid
分别给这2个文件赋予执行权限:
chmod +x /usr/local/gopath/bin/runderper
chmod +x /usr/local/gopath/bin/stopderper
注册service文件:
vim /etc/systemd/system/derper.service
粘贴如下内容并保存退出:
[Unit]
Description=derper.service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/go/bin/runderper
ExecStop=/usr/local/go/bin/stopderper
[Install]
WantedBy=multi-user.target
设置服务开机启动:
systemctl start derper
systemctl enable derper
rc.local方式
通过rc.local的方式开机加载脚本是比较古老的方法,却也是很多人习惯的简单的方式。但是在debian 9之后,系统默认已经不带rc.local文件了,只是保留了rc.local服务,例如运行如下命令:
cat /lib/systemd/system/rc-local.service
并且该服务默认是关闭状态,运行以下命令查看:
systemctl status rc-local
因为rc-local.servive文件里已经定义了rc.local文件的位置,所以我们只需要先手动创建rc.local文件,如下:
vim /etc/rc.local
然后粘贴以下内容并保存退出:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
赋予rc.local文件执行权限:
chmod +x /etc/rc.local
启动rc-local服务:
systemctl enable -now rc-local #设置服务开机启动
会弹出以下警告:
不用在意这个警告,因为这个服务只是关联rc.local一个文件而已。
再次运行命令查看服务状态:
systemctl status rc-local.service
可以看到service状态已经正常了。
以后需要开机启动的命令,直接添加到rc.local文件的exit 0之前就可以。如果是开机脚本,则用bash xxx.sh的方式添加到exit 0之前。
以我另一篇文章中的DERP服务端设置开机自启动为例(参见:在云主机上搭建tailscale DERP server(中继服务器)),有2种方式:
1、使用screen:
在exit 0前输入以下命令:
screen_name1="derper"
screen -dmSscreen_name1
cmd1="sleep 10;/usr/local/go/bin/runderper";
screen -x -Sscreen_name1 -p 0 -X stuff "cmd1"
screen -x -Sscreen_name1 -p 0 -X stuff '\n'
screen -x -Sscreen_name1 -p 0 -X stuff "exit"
该方式需要安装screen命令,该方式的好处是可以用screen命令切换到对应的终端,如果有多个一直运行在后台的程序时候很有用,例如,架设Trinitycore 3.5.5魔兽世界服务端的时候,worldserver和authserver需要开机自启动(参见:魔兽世界Trinitycore 3.3.5版本搭建傻瓜书)。
2、直接运行启动脚本
exit 0前输入以下命令:
bash /usr/local/go/bin/runderper
#使用Linux面板的进程守护管理器
我使用的宝塔Linux面板,软件中心里有个免费的程序:
安装并进入程序,点击红框中的添加守护进程:
这种方式最简单,我就不多说了,不过前提是大家安装了宝塔Linux面包或者其他有类似功能的面板。
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup