问题描述
我有一个从部署在 Centos 7 服务器上的计时器定期生成的 systemd 服务。 ExecStart 指令正在调用 bash 脚本,其输出使用 tee -a
重定向到控制台和文件。 Bash 脚本是一个调用 python 脚本的包装器。
奇怪的是,即使我可以使用 journalctl -xe -u my_service_name
看到 bash 脚本(包装器)输出和 Python 脚本输出,日志文件中也看不到 python 脚本的输出,只有 bash 命令的输出。
系统服务
# my_service.service
[Unit]
Description=My service
Wants=my_service.timer
[Service]
ExecStart=/bin/bash -c '/opt/services/my_service/my_service.sh | tee -a /var/log/my_service/my_service.log'
RuntimeDirectory=my_service
WorkingDirectory=/opt/services/my_service
[Install]
WantedBy=multi-user.target
Bash 脚本
#!/bin/bash
# my_service.sh (Bash wrapper for python script)
echo "My Bash script starts"
script_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
python3 -m venv "${script_dir}/venv"
. "${script_dir}/venv/bin/activate"
python my_service.py
echo "My Bash script ends"
Python 脚本
# my_service.py (called by Bash wrapper)
import logging
import sys
logger = logging.getLogger(os.path.basename(sys.argv[0]))
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] [%(process)d] [%(levelname)s] (%(name)s) %(message)s',datefmt='%Y-%m-%d %H:%M:%s %z')
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
logger.info("My python script {} starts".format(os.path.basename(sys.argv[0])))
logger.info("My python script {} ends".format(os.path.basename(sys.argv[0])))
journalctl 输出
# journalctl -xe -u my_service
-- Unit my_service.service has finished start-up with result done
feb. 0X 0X:XX:00 jenkins.hksiop.local bash[19140]: My Bash script starts
feb. 0X 0X:XX:00 jenkins.hksiop.local bash[19140]: [2021-0X-0X XX:XX:00 +0XXX] [19149] [INFO] My python script my_service.py starts
feb. 0X 0X:XX:00 jenkins.hksiop.local bash[19140]: [2021-0X-0X XX:XX:00 +0XXX] [19149] [INFO] My python script my_service.py ends
feb. 0X 0X:XX:00 jenkins.hksiop.local bash[19140]: My Bash script ends
-- Subject: Unit my_service.service has finished start-up
-- Defined-By: systemd
-- Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
# /var/log/my_service/my_service.log
My Bash script starts
My Bash script ends
我在这里错过了什么?为什么 journalctl 日志显示 bash 输出 + Python 输出而我的日志文件只显示 bash 输出?如何将 bash 和 python 脚本输出写入我的日志文件?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)