Linux下将python脚本封装成服务

将脚本封装成服务方便后台运行

nohup后台运行

nohup指不断地运行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。nohup在不规定的情况下,所以输出内容会到nohup.out中

运行示例:

1
2
nohup python my.py >> my.log 2>&1 &
nohup tomcat.sh > /dev/null 2>&1 &
  1. >>>都是将输出重定向到指定位置(如文件),区别在于前者重写文件,后者追加到文件

  2. /dev/null相当于一个垃圾箱,如果不想知道输出内容,可以指定输出到次数

  3. 关于0、1、2

    0 表示stdin标准输入,用户键盘输入的内容
    1 表示stdout标准输出,输出到显示屏的内容
    2 表示stderr标准错误,报错内容

  4. 2>&1是一个整体,>左右不能有空格,即将错误内容重定向输入到标准输出中去。

  5. &为后台运行

封装成system服务

这个方法只适用于使用systemd的Linux系统,现在流行的Linux发行版都使用systemd。后台服务程序是随系统自启动的,我们只要把Python脚本配置为服务就行了。需要注意的一点是你Python脚本的启动时机,它依赖不依赖其他服务(网络连接、一些分区的挂载等等)。

假设我们想将一个位置为/home/autorun.py的python脚本封装成服务。

创建Unit配置文件

1
vim /lib/systemd/system/autorun.service

向文件中写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]

Description=Test Service

After=multi-user.target

[Service]

Type=idle

ExecStart=/usr/bin/python /home/snail/autorun.py

[Install]

WantedBy=multi-user.target

上面定义了一个叫 Test Service 的服务,它在multi-user环境起来之后运行;ExecStart参数指定我们要运行的程序,注意使用绝对路径;idle确保脚本在其他东西加载完成之后运行,它的默认值是simple。为了获得脚本的输出信息,我们可以重定向到文件:

1
ExecStart=/usr/bin/python /home/snail/autorun.py > /home/snail/autorun.log 2>&1

之后更改配置文件的权限:

1
sudo chmod 644 /lib/systemd/system/autorun.service

使配置文件生效

1
2
3
4
systemctl daemon-reload
systemctl enable autorun.service
systemctl start autorun.service
systemctl status autorun.service