服务失败自动重启,获取程序日志

本文详细介绍了在Linux环境中使用自定义脚本、crontab、systemd和daemontools来管理和监控服务的方法,包括服务的启动、停止、重启及状态查看。特别是daemontools的编译安装、基本使用和日志管理,展示了如何实现服务的自动化管理和故障恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,自定义脚本

[root@test1 ~]# cat a.sh 
function start_svc(){
   while : 
   do
     echo 'checking...'
     res=`ps -ef |grep  /bin/myproc1 |grep -v grep` 
     [[ -n $res ]] || ( echo 'svc is died, restarting....' && /app/myproc1/bin/start  && echo 'start done.' )
     sleep 2
   done
}
start_svc  2>&1 > /tmp/a.log &

[root@test1 ~]# sh a.sh
[root@test1 ~]# ps -ef |grep a.sh
root      382357       1  0 10:18 pts/3    00:00:00 sh a.sh
root      383502  381791  0 10:21 pts/3    00:00:00 grep a.sh

[root@test1 ~]# tail /tmp/a.log 
checking...

2,使用crontab

[root@test1 ~]# crontab -l
*/2 * * * * res=`ps -ef |grep  /bin/myproc1 |grep -v grep` ; [[ -n $res ]] || ( date; echo 'svc is died, restarting....' && /app/myproc1/bin/start 2>&1  && echo 'start done.' ) > /tmp/a.log 

3,使用systemd

[root@test1 ~]# cat /usr/lib/systemd/system/myproc1.service
[Unit]
Description=myproc1

[Service]
Type=forking
ExecStart=/app/myproc1/bin/start 
PrivateTmp=true

Restart=always
RestartSec=5
StartLimitInterval=0

[Install]
WantedBy=multi-user.target

[root@test1 ~]# systemctl start myproc1
[root@test1 ~]# systemctl enable myproc1

4, 使用daemontools

4.1,编译安装

源码下载:http://cr.yp.to/daemontools/install.html
编译好的二进制包下载 (提取码:abcd):https://pan.baidu.com/s/1v3BfNn-mOPytM5_k4A3FSQ

#安装后的目录结构(/service, /command --> /opt/admin/daemontools/command/)
# mkdir /service;  chmod 1755 /service; chmod 1755 /service
# ln -sf /opt/admin/daemontools/command/ /command;   ln -sf /command/* /usr/local/bin/

[root@c7-docker ~]# ls /opt/admin/ -l
total 4
lrwxrwxrwx. 1 root root   16 Apr  6 18:39 daemontools -> daemontools-0.76
drwxr-xr-x. 6 root root 4096 Mar 25 10:29 daemontools-0.76
[root@c7-docker ~]# ls /opt/admin/daemontools
command  compile  package  src
[root@c7-docker ~]# ls /opt/admin/daemontools/command/
envdir     fghack    pgrphack       setlock    softlimit  svc   svscan      svstat  tai64nlocal
envuidgid  multilog  readproctitle  setuidgid  supervise  svok  svscanboot  tai64n
[root@c7-docker ~]# ls /command -l
lrwxrwxrwx. 1 root root 31 Apr  6 18:55 /command -> /opt/admin/daemontools/command/


#环境变量-链接
[root@c7-docker ~]# which svc
/usr/local/bin/svc
[root@c7-docker ~]# ll /usr/local/bin/svc
lrwxrwxrwx. 1 root root 12 Apr  6 19:05 /usr/local/bin/svc -> /command/svc
[root@c7-docker ~]#  ll /usr/local/bin/svscanboot
lrwxrwxrwx. 1 root root 19 Apr  6 19:05 /usr/local/bin/svscanboot -> /command/svscanboot

4.2,基本使用

#---1,管理服务:停止,重启
#Easy, reliable signalling. With /service, the system administrator can use svc to control your daemon. For example:
svc -o /service/yourdaemon: runs the service once
#重启服务
svc -t /service/yourdaemon: sends TERM, and automatically restarts the daemon after it dies
#停止服务
svc -h /service/yourdaemon: sends HUP
svc -d /service/yourdaemon: sends TERM, and leaves the service down
#启动服务
svc -u /service/yourdaemon: brings the service back up


#---2,状态查看
[root@c7-docker ~]# svstat /service/test1
/service/test1: up (pid 17014) 0 seconds

[root@c7-docker ~]# ps -ef |grep svs
root       791     1  0 08:44 ?        00:00:00 /bin/sh /command/svscanboot
root       795   791  0 08:44 ?        00:00:00 svscan /service
root     17305  1559  0 09:19 pts/0    00:00:00 grep --color=auto svs

#查看管理的服务和 pid号
[root@c7-docker ~]# pstree -a -p 791
svscanboot,791 /command/svscanboot
  ├─readproctitle,796 service errors:...
  └─svscan,795 /service
      └─supervise,805 test1
          └─(date,17430)


#---3,修改被管理的服务: How do I upgrade a service directory? I need to change ./run.
Create ./run.new and atomically rename ./run.new to ./run. Then use
     svc -t .
to send a TERM signal to the daemon. supervise will start the new ./run after the daemon exits.

4.3,测试:前台运行的服务

#配置服务(前台允许的,不是后台运行),并获取日志
####### 1,启动服务
[root@c7-docker ~]# cat /service/aaa/run
#!/bin/bash
#exec 2>&1
#exec envuidgid user1 envdir ./env softlimit -d300000 command.....
exec date
[root@c7-docker ~]# svc -u /service/aaa/



####### 2,启动日志获取 (需要手动创建 log/main日志目录)
[root@c7-docker ~]# cat /service/aaa/log/run
#!/bin/bash
#exec setuidgid user1 multilog t ./main
exec multilog t ./main
[root@c7-docker ~]# mkdir -p /service/aaa/log/main/
[root@c7-docker ~]# svc -u /service/aaa/log/
# 查看程序运行日志
[root@c7-docker ~]# tail -n2 /service/aaa/log/main/
@4000000060750f7529f9b84c.u  current                      lock                         state
[root@c7-docker ~]# tail -n2 /service/aaa/log/main/current
@40000000607539a23840ac44 Tue Apr 13 14:26:32 CST 2021
@40000000607539a33aa2c7c4 Tue Apr 13 14:26:33 CST 2021



####### 3,配置自动管理tomcat重启
[root@c7-docker opt]# cat /service/tomcat/run
#!/bin/bash
exec 2>&1
#exec setuidgid  vagrant whoami
#exec setuidgid  vagrant java -jar /opt/com.example.demo-0.0.1-SNAPSHOT.jar
exec setuidgid  vagrant /opt/apache-tomcat-8.5.54/bin/catalina.sh run
[root@c7-docker opt]# cat /service/tomcat/log/run
#!/bin/bash
#exec setuidgid vagrant multilog t ./main
exec setuidgid vagrant multilog  ./main
[root@c7-docker ~]# mkdir -p /service/tomcat/log/main ; chown -R vagrant /service/tomcat/log/
[root@c7-docker ~]# svc -u /service/tomcat
[root@c7-docker ~]# svc -u /service/tomcat/log/


####### 4,查看进程状态
[root@test-c62 opt]# ps -ef |grep svs
root      7176 17071  0 19:28 pts/0    00:00:00 /bin/sh /usr/local/bin/svscanboot
root      7178  7176  0 19:28 pts/0    00:00:00 svscan /service
root     18329 17071  0 19:50 pts/0    00:00:00 grep svs
[root@c7-docker opt]# pstree -ap 7176
svscanboot,7176 /usr/local/bin/svscanboot
  ├─readproctitle,7179 service errors:...
  └─svscan,7178 /service
      ├─supervise,7180 aaa
      │   └─(date,18330)
      ├─supervise,7181 log
      │   └─multilog,7185 t ./main
      ├─supervise,7182 tomcat
      │   └─java,18131 -Djava.util.logging.config.file=/opt/apache-tomcat-8.5.54/conf/logging.properties...
      │       ├─{java},18142
      │       ├─{java},18143
      │       ├─{java},18158
      │       └─{java},18160
      └─supervise,7183 log
          └─multilog,11207 ./main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根哥的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值