持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
Linux下的自动启动探秘
前面的文章中我将网站部署到服务器上用的是在Linux下的/etc/profile.d文件夹下放置shell脚本的启动方式。
这个方式缺陷就是必须要有用户登录才能使用,这明显不符合我们对开机启动的期望值,机器只有一个用户使用还好,当多个用户使用时,这个东西就会启动很多次,然后有的用户重启电脑后,又不登录,那个网站就访问不了了。
Linux有很多种方式来自动启动程序,这里介绍常用的两种。
一、shell登录启动
在/etc/profile.d文件夹中放脚本本身也不失为一个好方法,只要你把脚本放进去,他就能在用户登录的时候执行。
操作的时候,只要把自己写好的脚本放进去即可使用。脚本并不需要严格按照格式处理。这种方式必须要有用户执行shell类型的登录,非shell登录并不会启动这个文件夹下的脚本。
同样的,etc文件夹下面还有个profile的文件,里面是用来存储用户的环境变量的,如果你有什么环境变量需要设置,可以在这文件的末尾添加,添加后可以用source命令使其立即生效,也可以等下一次重启生效。
二、使用rc.local的开机启动
1.rc.local方式在centos系统的实现
这个文件在centos系统下的具体路径是:/etc/rc.d/rc.local
在centos系统下,这个文件本身并不需要特别的启动方式,启动已经由系统处理好了,我是直接编辑的,文件要是不存在,需要vi进去,然后保存,运行的命令必须是全路径,没有环境变量支持。
注意这个文件一定要是linux系统下生成的,因为我一开始在Windows下,直接用pycharm的浏览远程服务器创建的文件怎么也启动不了。
如果是自己创建的,文件建立后需要加上权限,建议设置为755,可以执行。一般来说文件都是存在的。
2.rc.local在Ubuntu系统的实现
这个文件在Ubuntu系统上的具体路径是:/etc/rc.local的文件
在Ubuntu下,因为较新的版本逐渐抛弃了这个启动方式,文件位置也不一样所以这里创建文件后,还需要在那个文件夹里systemctl start rc-local。注意是rc-local,不是rc.local。
部分电脑还需要在/lib/systemd/system下的rc-local.service文件编辑,增加:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
这个文件也是指定rc.local作为脚本的主要依据,下图所示是centos下的,Ubuntu下的文件大同小异。ExecStart那里指明了是启动的哪里的rc.local
这句话我们也可以尝试用来手动调试脚本。但是一定要注意文件开头用于声明运行的程序的语句不能少,否则会提示文件格式不正确。
此时可以用system start rc-local再次尝试
因为系统版本不一样,结果可能会有所区别。
三、特别注意
特别要注意不要在windows下创建文件,创建的文件因为换行符不一样,会产生一些奇怪的问题。
检验文件是不是那个产生的,可以使用od -tx 文件,这个命令。
有很多0a0d一起的就是说明这个文件是执行的windows的编码。有些文件可以删除这些换行符后使用,但有些文件怎么也删除不干净。sh文件pycharm本身可以通过识别来自己替换编码,但普通文件并没有适应这个功能,所以最好的就是使用命令来创建文件。
举例:
我创建了一个121.sh
再右键新建一个dd文件
两个文件都在root目录下
此时sh dd,会提示你找不到文件或者目录
但我们用vi重新创建一个文件,写入相同的话语。
再sh ddd,就会正常显示
所以一定要注意编码的问题,有时候并不是脚本语法写错了,而是文件的创建地点搞错了。