Centos _ Ubuntu 自启动服务 - 测试记录 - 杂记

发布时间 2023-03-24 16:51:45作者: Loki_Severus

@

1. 启动服务文件创建位置

Ubuntu18.04的改动

sudo systemctl start XXX.service

systemctl service服务文件夹在/lib/systemd/system(基本服务文件夹)与/etc/systemd/system(开机启动文件夹)。
添加基本服务,可以在/lib/systemd/system下创建 XXX.service,当然 /etc/systemd/system 目录也是可以的。


2. 不同操作系统 sh 文件格式报错

问题关键的是在win10系统内创建文本,然后修改它的后缀为sh文件,看起来是没问题,但是一旦你拉到Linux过去,将它作为一个shell文件使用,shell终端会报203错误,
没有解释器指向(#!/bin/sh),但其实不是这个问题,是文件有问题,你应该在Linux系统内创建一个shell文件,然后将脚本代码复制过去,而不是在Windows系统创建shell文件
而且不要自作聪明,以为在Linux里面创建好shell文件后,在拖到Windows系统里,然后在拖到其他的Linux系统里,这看似没问题,但实际使用时依旧会报203错误

我认为应该是系统格式问题,Linux——>Windows——>Linux 中间Windows系统格式把Linux的系统格式给改变了


3. sh 文件格式问题解释

主要原因是test.sh是我在windows下编辑然后上传到linux系统里执行的。
.sh文件的格式为dos格式。
linux只能执行格式为unix格式的脚本。因为在dos/window下按一次回车键实际上输入的是“回车(CR)”和“换行(LF)”,
而Linux/unix下按一次回车键只输入“换行(LF)”,所以修改的sh文件在每行都会多了一个CR,所以Linux下运行时就会报错找不到命令。
我们可以通过vi编辑器来查看文件的format格式。步骤如下:
1.首先用vi命令打开文件

[root@localhost test]# vi test.sh   

2.在vi命令模式中使用 :set ff 命令
可以看到改文件的格式为
复制代码 代码如下:

fileformat=dos

3.修改文件formatunix
使用 vi/vim 修改文件格式 format
命令::set ff=unix
或者::set fileformat=unix

然后:wq保存退出就可以了


还有Linux系统只需要前面表明解释器的代码,如shell文件是 #!/bin/sh
所以文件后缀是.sh 其实没什么,有没有加sh后缀,只是为了看起来方便而已,重点是解释器指向,即文件内有没 #!/bin/sh,或者不加 #!/bin/sh 也可以,反正都是在 shell 终端运行,自然是用 shell 解释器运行文件

最后shell文件内的py脚本运行文件记得加权限
chmod a+x xxx.py

4. /etc/systemd/system/xxx.service 服务文件配置

Type=forking 多数服务会在启动后放入后台,systemd通过Type=forking来支持这种工作方式。
如果启用该项,建议同时设置PIDFile选项,这样可以帮助systemd更准确的定位到服务进程
PrivateTmp 保证一定的安全性 true
TimeoutStopSec 超时停止10s
Restart 在意外退出时重启 on-failure
RestartSec 重启间隔 5s
Alias 服务别名

service文件内容如下:


[Unit]                                                                       
Description=XXX Service

[Service]
#用户一般是 root 用户
User=root 

Type=forking

#该服务进程具体的shell执行文件,xxx 是文件名,不是文件夹名,我这里是将shell文件添加到/usr/sbin路径下,记得为shell文件配置权限 chmod a+x   service文件不需要


ExecStart=/usr/sbin/XXX 
ExecReload=/usr/sbin/XXX 
ExecStop=/usr/sbin/XXX 
PrivateTmp=true
#以下这些不用改,照旧就行
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

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

弄好了上面的配置之后运行如下命令让服务生效,有的时候需要重启电脑才能生效,这是很多教程没提到的情况!

sudo systemctl daemon-reload

重载后运行

sudo systemctl start mycat.service

如果想加到开机启动,就运行

sudo systemctl enable XXX.service

上面这条命令是建立软连接,默认建立硬链接,除非加参数才是软连接
这个时候系统会自动加载mycat.service/etc/systemd/system文件夹下,
很多教程直接自己链接过去,不推荐那么干,因为有的自己链接会出现未知的错误,
很难找到原因,容易翻车


Centos service配置文件如下

[Unit]                                                                       
Description=XXX Service

[Service]
#用户一般是 root 用户
User=root 

Type=forking

#该服务进程具体的shell执行文件,xxx 是文件名,
#不是文件夹名,我这里是将shell文件添加到/usr/sbin路径下,
#记得为shell文件配置权限 chmod a+x   service文件不需要

ExecStart=/usr/sbin/XXX start
ExecReload=/usr/sbin/XXX restart
ExecStop=/usr/sbin/XXX stop
PrivateTmp=true
#以下这些不用改,照旧就行
SuccessExitStatus=143
TimeoutStopSec=10
Restart=on-failure
RestartSec=5

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

Centos、Ubuntu服务启动命令:

systemctl start XXX.service
systemctl stop XXX.service
systemctl restart XXX.service

或者

service xxx start 
service xxx stop
service xxx restart