Logrotate Don't Work With Supervisor on Ubuntu 20.04 With Systemd

tags: Linux,Systemd,Supervisor,Logrotate Background I usually use supervisor1 to deploy my services, and capture the stdout/stderr to the log files, and then use logrotate to rotate the logs, which the configuration likes: /data/log/app/*/*.log { daily missingok rotate 180 dateext compress delaycompress notifempty create 640 nobody adm sharedscripts postrotate /usr/local/bin/supervisorctl -c /etc/supervisord.conf pid && kill -USR2 `/usr/local/bin/supervisorctl -c /etc/supervisord.conf pid` > /tmp/kill.log 2>&1 endscript } As you can see, I make the logrotate to send a signal to supervisord after the logs have been rotated, to let the supervisord reopen the logs....

November 1, 2023 · 2 min · Gray King

Wrap & Unwrap errors in Go

tags: Go source: “Wrap and Unwrap Errors in Go (Golang) | Gosamples.Dev.” Accessed October 12, 2022. https://gosamples.dev/wrap-unwrap-errors/. Overview Since Go1.13, there is a new feature about error add to go: Wrap & Unwrap errors. Let’s start from a simple example: package main import ( "errors" "fmt" ) var errRollingInTheDeep = errors.New("rolling in the deep") func doSomeActualJob() error { return errRollingInTheDeep } func someFrameworkCaller() error { // We use fmt.Errorf to wrap error....

October 12, 2022 · 3 min · Gray King

actix-web extractors 支持提取任意长度的参数

tags: Rust 背景 今天看了一下 actix-web 发现该框架支持基于参数的 Extractor,可以非常方便地解析参数(包括 URI、Query、JSON 和 FormData)。 先来看一个在项目 README.md 中的例子: use actix_web::{get, web, App, HttpServer, Responder}; #[get("/{id}/{name}/index.html")] async fn index(web::Path((id, name)): web::Path<(u32, String)>) -> impl Responder { format!("Hello {}! id:{}", name, id) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().service(index)) .bind("127.0.0.1:8080")? .run() .await } 初看之下觉得很神奇,但细想通过宏实现应该不是特别困难,然后发现其官网还有不是基于宏的运行时调用: use actix_web::{web, App, HttpRequest, HttpServer, Responder}; async fn greet(req: HttpRequest) -> impl Responder { let name = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!...

December 21, 2021 · 3 min · Gray King

Airflow powers AI

背景介绍 最近接手了一个项目,经过需求调研决定尝试使用 Airflow 调度数据生产,过程涉及: 从大数据 Hive 数据库整合数据宽表; 在 Spark 上运行 IRT 算法模型汇总 ADS 表。 从中学习了很多关于大数据的知识,同时也积累了如何通过 Airflow 提交 Spark 任务的经验,应当抽时间总结一下。 冰山之下 如「冰山理论」所描述,我们所做的只是冰山露在水面的一角,隐藏在冰山之下更大的一部份是: Airflow + Celery Docker Hadoop(Hive) 集群 YARN 集群(Spark over YARN) 接下来我们将关注在「冰山水面上的一角」来阐述我们如何利用这些已有的技术连结了整个系统。 Make DAG great again 之前部门里有位算法大佬用 DAG(大佬念做「戴格」)实现了一套非常牛逼的文本和识别处理算法,然后每次讨论方案必谈 DAG, 所以 DAG 成了部门里都知道的一个梗,虽然大佬走了之后很少再有人提起 DAG,但是接下来我们会进行文艺复兴,让 DAG 再次出现在我们的日常技术讨论中。 Make DAG Great Again! Airflow 介绍 架构 概念 DAG Operator Connection Providers packages See also: Provider packages. Spark 介绍 架构 Spark 编程 Spark SQL Hive Table 示例 Airflow + Spark 平台化 Celery Worker as a Spark Driver Celery Worker running on specific platform Windows Bigdata Hive client DAGs 分发 提交 DAG Python 依赖解决 Spark Airflow 外部依赖? 未来 承接更多的报告需求 对内承接分析任务 可编程、平台化的分析

August 26, 2021 · 1 min · Gray King

Understanding Rust futures by going way too deep

tags: Translate,Rust,Tokio 原文链接:Understanding Rust futures by going way too deep。 译者注:原文大量的引入了有趣的对话,迫于排版问题这里不进行翻译,必要的对话通过引用块来解释。 深入理解 Rust future 用 Rust future!就是这么简单!直到我们发现并非如此。所以我们先探索简单的部分,然后继续探索困难部分而不是等它慢慢靠近我们。 起步 Choo choo here comes the easy part 🚂💨 我们创建一个新的项目: $ cargo new waytoodeep Created binary (application) `waytoodeep` package 我们需要安装 cargo-edit 如果之前没有安装过的话,接下来就可以直接 cargo add : $ cargo install cargo-edit Updating crates.io index Downloaded cargo-edit v0.7.0 Downloaded 1 crate (57.6 KB) in 0.47s Ignored package `cargo-edit v0.7.0` is already installed, use --force to override 因为 cargo-edit 很方便,所以你可能已经安装过它。部分读者会感到困惑是因为像 cargo new, cargo build, cargo test, cargo run 等子命令都内置在 cargo 中, 但是 cargo add 没有。...

July 26, 2021 · 44 min · Gray King