0%

Linux中的定时任务

最近常遇到需要在linux系统中一直启动一个服务、或定时启动某服务的场景。

最简单的在用ssh连接启动程序,但因为程序是从ssh shell中fork出的子进程,程序会随着ssh的中断而中断。因此调研的两种方法

crontab

crontab轻量,不需要太多配置

1
crontab -e   #cron编辑的文件以用户为单位存放在 /var/spool/

crontab中任务的格式为

cron时间 命令

如每分钟向日志中写入”test”

1
* * * * *  echo "test" >> ~/1.log    

cron时间是一个类似于正则的表达可以在这里查看https://crontab.guru/

systemd

systemd更“重”一点,优点是自动记录log、通过配置.service文件就可以传入环境变量给进程。但配置.service文件比较麻烦

systemd是一个linxu服务管理工具,面向进程。系统的init进程就是它创建的。

ps -ef 查看:

image-20211224174422781

操作步骤

  1. 在/etc/systemd/system中添加service配置文件mytest.service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [UNIT]
    #服务描述
    Description=Browser Preview Service
    #指定了在systemd在执行完那些target之后再启动该服务
    After=network.target

    [Service]
    #定义Service的运行类型
    Type=simple
    #定义systemctl start|stop|reload *.service 的执行方法(具体命令需要写绝对路径)
    #ExecStartPre为启动前执行的命令
    #项目中有相对路径时要指定工作目录
    WorkingDirectory=/root/http_server
    ExecStart=/root/http_server/main 8090
    ExecReload=
    #MAINPID是systemd记录的主进程PID
    Restart=always
    ExecStop=/bin/kill -9 ${MAINPID}

    [Install]
    #多用户
    WantedBy=multi-user.target
  2. 查看service状态

    1
    systemctl status mytest.service
  3. 启动service

    1
    systemctl start mytest.service
  4. 停止service

    1
    systemctl stop mytest.service