总的解决思路
编写xxx.service文件导入到/etc/systemd/system,最终通过systemctl start xxx.service启动服务,通过systemctl enable xxx.service实现开机自启动。
如何编写自己的xxx.service文件?
如何后台运行python脚本?python程序中print的输出则么办?
1.如何编写自己的xxx.service文件?1
详细的可以参考这里
/etc/systemd/system主要有四种类型文件.mount,.service,.target,.wants
.mount文件定义了一个挂载点,[Mount]节点里配置了What,Where,Type三个数据项
.service文件定义了一个服务,分为[Unit],[Service],[Install]三个小节。
.target定义了一些基础的组件,供.service文件调用
.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行
[Unit]
Description:描述,
After:在network.target,auditd.service启动后才启动
ConditionPathExists: 执行条件
[Service]
EnvironmentFile:变量所在文件
ExecStart: 执行启动脚本
Restart: fail时重启
[Install]
Alias:服务别名
WangtedBy: 多用户模式下需要的
2.运行python脚本
在service文件中添加执行命令即可
ExecStart:/usr/bin/python ./client_r.py
3.python程序中print的输出则么办?-输出重定向2
以下命令实现:指定python运行脚本,将本应该输出到终端的文字重定向到log.txt
sudo /usr/bin/python3 -u ./client_r.py > log.txt 2>&1
-u:无缓存,运行过程输出立刻进入到log.txt。正常情况python的输出先到缓存区,运行过程中的输出不能立即在log中看到
2>&1:将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意, 2>&1 是一体的,可以认为是固定写法
附录
systemd原理3
service配置文件45
Unit:定义与unit类型无关的通用选项;用于提供unit的描述信息,unit行为及依赖关系;
Service:与特定类型相关的专用选项;此处为service类型;
Install:定义由”systemctl enable”以及”systemctl disable”命令在实现服务启动或禁用时用到的一些选项。
[Unit]
After -表示服务需要在***服务启动之后执行,无依赖
Before -表示服务需要在***服务启动之前执行,无依赖
Wants -弱依赖关系
Requires -强依赖关系***停止之后本服务也必须停止
[Service]
EnvironmentFile -环境参数文件,EnvironmentFile=/etc/sysconfig/sshd 以key=value的形式保存,以$key形式读取
ExecStart -启动进程时执行的命令
ExecReload -重启服务时执行的命令
ExecStop -停止服务时执行的命令
ExecStartPre -启动服务之前执行的命令
ExecStartPost -启动服务之后执行的命令
ExecStopPost -停止服务之后执行的命令
Type
simple(默认值)-ExecStart字段启动的进程为主进程
forking -ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
oneshot -类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
dbus -类似于simple,但会等待 D-Bus 信号后启动
notify -类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
idle -类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
KillMode
control-group(默认值)-当前控制组里面的所有子进程,都会被杀掉
process -只杀主进程
mixed -主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none -没有进程会被杀掉,只是执行服务的 stop 命令
Restart
no(默认值)-退出后不会重启
on-success -只有正常退出时(退出状态码为0),才会重启
on-failure -非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal -只有被信号终止和超时,才会重启
on-abort -只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog -超时退出,才会重启
always -不管是什么退出原因,总是重启
[Install]
Alias -别名,可使用systemctl restart Alias.service
RequiredBy -被哪些units所依赖,强依赖;
WantedBy -被哪些units所依赖,弱依赖;
注:
所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,
不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误。
理解:service ssh start,start是作为传入参数传到ssh.service6
https://www.cnblogs.com/shijingjing07/p/9301590.html ↩︎
http://c.biancheng.net/view/5956.html ↩︎
https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html ↩︎
https://www.linuxidc.com/Linux/2019-08/159995.htm ↩︎
http://www.178linux.com/49806 ↩︎
http://www.mikewootc.com/wiki/linux/usage/ubuntu_service_usage.html ↩︎