HOWTO:保存nohup日志

本文介绍了如何通过rotatelogs工具来有效管理nohup进程产生的日志文件,包括按天和按文件大小两种策略。

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

默认情况下,nohup的日志将保存在一个名为nohup.out的文件中。随着时间的推移,nohup.out文件会变得越来越大,直到某一天程序莫名的崩溃。这种情况是可以预防的,有很多策略都可以解决这个问题。

Strategy#1 利用rotatelogs分割日志

每天写一个日志:

nohup ./startWebLogic.sh | /usr/sbin/rotatelogs -l /var/logs/logfile.%Y.%m.%d 86400 &

每512M写一个日志:

nohup ./startWebLogic.sh | /usr/sbin/rotatelogs -l /var/logs/logfile 512M &

rotatelogs的详细内容,点这里

转载于:https://www.cnblogs.com/MagicLetters/p/4382846.html

### 关于 Locust 使用 `nohup` 命令时重复日志输出到 `nohup.out` 的解决方案 当使用 `nohup` 运行 Locust 并将其标准输出和错误重定向至 `nohup.out` 文件时,可能会遇到日志重复写入的问题。以下是可能的原因以及对应的解决方法。 #### 可能原因分析 1. **默认的日志行为冲突** Locust 自身具有内置的日志机制,默认情况下会将日志输出到控制台[^2]。而 `nohup` 将所有未被显式重定向的标准输出和错误流追加到 `nohup.out` 中,这可能导致同一份日志既出现在控制台上又被捕获并存储在文件中。 2. **Python 缓冲区的影响** 如果 Python 输出缓冲未关闭或未强制刷新,某些日志目可能不会立即写入目标文件而是滞留在内存中,最终导致重复写入的现象[^4]。 3. **权限问题或其他环境干扰** 若存在其他进程尝试操作相同资源(如文件描述符),也可能引发异常情况,例如无法正常关闭特定文件描述符从而造成额外数据流向 `nohup.out`[^3]。 #### 解决方案 针对上述提到的各种可能性,可采取如下措施: - #### 配置自定义日志路径而非依赖默认终端输出 修改 Locust 启动参数或者调整其内部配置以指定独立的日志位置而不是单纯依靠 stdout/stderr 。这样能够有效避免两者之间的相互影响。 ```bash locust -f your_locustfile.py --logfile=/path/to/your/logfile.log ``` - #### 显式处理文件描述符 在脚本开头手动关闭不必要的输入源 (通常是 fd=0),防止潜在污染: ```python import os os.close(0) if hasattr(os, 'close') and callable(getattr(os, 'close')) else None ``` 注意这里仅作为示范用途,在实际应用前需确认具体需求场景下是否适用此做法. - #### 禁止全局范围内的输出缓存 为了确保即时更新而不延迟反馈给外部监控工具等组件查看进度状态的话,则可以通过设置环境变量来达到目的: ```shell script export PYTHONUNBUFFERED=true ``` 另外也可以直接嵌套进命令串里执行: ```bash PYTHONUNBUFFERED=true nohup python -u main_script.py > output_file.txt & ``` 此处 `-u` 参数指示解释器采用非缓冲二进制模式读取 stdin 和写出 stdout / stderr ,配合前面提及的方法共同作用效果更佳. 最后考虑切换成无头浏览器形式运行测试任务或许也是一个不错的选择因为那样就不会涉及到太多关于本地系统层面交互方面的麻烦事了[^5]: --- ### 实际案例演示代码片段 下面给出一段综合运用这些技巧后的完整样例供参考学习: ```python #!/usr/bin/env python3 import os from locust import HttpUser, TaskSet, task def setup_logging(): """Redirect all logging messages to a dedicated file.""" import logging.handlers logger = logging.getLogger() handler = logging.FileHandler('/tmp/myapp.log') formatter = logging.Formatter('%(asctime)s %(levelname)-8s:%(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) if __name__ == "__main__": try: # Close standard input stream. os.close(0) # Setup customized log settings before initializing anything from Locust framework. setup_logging() class UserBehavior(TaskSet): @task def my_task(self): self.client.get("/") class WebsiteUser(HttpUser): tasks = {UserBehavior} except Exception as e: with open('error_log', 'a+') as f: print(f'Error occurred during execution: {str(e)}', file=f) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值