Linux脚本:将.sh文件输出映射到日志文件并添加时间戳

文章目录

背景

  • 在linux系统中,当调用.sh脚本时,脚本中的标准输出原本是打印到控制台的,我们可以将其打印到某个文件,并添加上时间戳,方便问题溯源。
  • 有时我们运行的脚本是.py脚本,也需要将输出映射到日志文件。

解决办法

调用.sh脚本时

  • 假设我的目标脚本名为script.sh脚本,我需要写一个start.sh脚本,在该脚本中启动script.sh脚本,并将script.sh脚本的输出保存到out_log.txt文件中,过程如下:
  • 首先安装moreutils包:
bash 复制代码
sudo apt-get update
sudo apt-get install moreutils
  • 编写 start.sh 脚本:这个脚本将启动 script.sh 并处理日志重定向和时间戳添加。
bash 复制代码
# 运行 script.sh,并将其输出重定向到 out_log.txt,添加时间戳
./script.sh 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' >> out_log.txt
  • 如果不安装moreutils包,将start.sh改为如下内容即可:
bash 复制代码
# 运行 script.sh,并将其输出重定向到 out_log.txt,添加时间戳,并在后台运行
(
  while IFS= read -r line
  do
    echo "$(date '+[%Y-%m-%d %H:%M:%S]') $line"
  done < <(./script.sh 2>&1)
) >> out_log.txt &
  • 假设script.sh脚本中内容如下:
bash 复制代码
#!/bin/sh

echo "Script started"
echo "Doing some work..."
sleep 2
echo "Work done"
echo "Script finished"
  • 最终结果我们将看到输出如下:
bash 复制代码
[2024-06-06 12:00:00] Script started
[2024-06-06 12:00:00] Doing some work...
[2024-06-06 12:00:02] Work done
[2024-06-06 12:00:02] Script finished

调用.py脚本时

  • 我们新建一个运行目标start.sh的启动脚本如下:
bash 复制代码
current_time=$(date +"%Y-%m-%d-%H-%M-%S")

echo "${current_time} start python3:\n" >>output.log

nohup python3 Test1.py &

echo $! > pid_file.txt
  • 在start.sh脚本中启动目标的.py文件。在.py脚本中,加入以下命令使能将print打印到日志文件:
py 复制代码
PrintToFile = True

if PrintToFile:
    # 配置日志记录器
    logging.basicConfig(filename='output.log', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')

    # 定义一个函数用于重定向标准输出到日志文件
    def redirect_stdout_to_log():
        class StdOutLogger(object):
            def write(self, message):
                # 添加时间信息并写入日志文件
                logging.info('%s %s', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), message.rstrip())

            def flush(self):
                pass

        # 将标准输出重定向到 StdOutLogger 类的实例
        sys.stdout = StdOutLogger()

    # 调用函数将标准输出重定向到日志文件
    redirect_stdout_to_log()
  • 并将该进程号保存在一个pid_file.txt中。当我们后面想停止该进程时,直接运行以下stop.sh脚本即可:
bash 复制代码
pid=$(cat pid_file.txt)

kill $pid
相关推荐
BU摆烂会噶4 分钟前
【LangGraph】House_Agent 实战(四):预定流程 —— 中断与人工干预
android·人工智能·python·langchain
AI玫瑰助手4 分钟前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
一个在高校打杂的6 分钟前
honeypot之opencanary(轻量化蜜罐)
linux·网络安全·网络攻击模型·安全威胁分析·策略模式
s_w.h13 分钟前
【 linux 】认识make和makefile
linux·运维·bash
GIOTTO情16 分钟前
Infoseek舆情处置系统的技术实现与落地实践
python
不怕犯错,就怕不做24 分钟前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件
Harm灬小海28 分钟前
【云计算学习之路】学习Centos7系统-Linux软件包管理
linux·运维·服务器·学习·云计算·yum·rpm
caicai_xiaobai31 分钟前
Ubuntu上Git安装步骤
linux·git·ubuntu
new_dev34 分钟前
Python实现Android自动化打包工具:加固、签名、多渠道一键完成
android·python·自动化
平行云41 分钟前
实时云渲染平台数据通道,支持3D应用文件上传下载分享无缝交互
linux·unity·云原生·ue5·gpu算力·实时云渲染·像素流送