Skip to content

Instantly share code, notes, and snippets.

View jschwinger233's full-sized avatar
😭
On vacation

graymon jschwinger233

😭
On vacation
  • China
View GitHub Profile

Q1: 多次处理 stdout

比如我要先判断 stdout 里是否匹配某模式, 匹配则对 stdout 做进一步处理.

无脑一点, 我们可以把 stdout 写到临时文件里:

tmpfile=$(mktemp)
cmd | tee $tmpfile | inspect $pattern && process $tmpfile
rm -f $tmpfile
@jschwinger233
jschwinger233 / etcdh.sh
Created March 6, 2020 09:07
fetch history values for a specific key in hard way
.

工程上的问题就是复杂多变, 今天我死活都运行不了 calicoctl, 硬着头皮还是找到了问题, 重新总结 calico sdn 的思路.

症状: host1 不能 ping host2 上的容器 c1

  1. 直接检查 host1 的 ip r
    1. 有通往 c1 的路由说明 felix + bgp 都正常;
    2. 如果宿主机的网络配置复杂难以肉眼判断, 那么可以通过 birdcl show route for [c1 ip] 看结果;
    3. 留意 host1 和 host2 之间的网络环境, 如果宿主鸡 L2 不可达那么(在无 switch 支持的情况下) route 应该是要通过 ipip 隧道的;
    4. 如果没有路由, 那么是 bgp / felix / wep 的锅.
  2. 如果有路由, 直接怀疑 iptables, 直接在 host1 / host2 / c1 namespace 三处同时抓包, 最明显的临床症状是 host1 + host2 能抓包但是 c1 network namespace 里抓不到, 那就实锤.

发现 docker cp 的实现跟屎一样.

一开始发现的问题是 docker-ce/components/client 里的 CopyToContainer 这个 interface, 签名是这样的:

CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error

我注意到的问题是里面 path 必须是 dirname, 比如说你想 docker cp ./a.txt $CONTAINER_ID:/etc/b.txt, 那么 path 必须是 /etc, 否则直接报错.

# init
systemctl stop iptables
apt update -y
# etcd
curl -OL https://github.com/etcd-io/etcd/releases/download/v3.3.10/etcd-v3.3.10-linux-amd64.tar.gz
tar xf etcd-v3.3.10-linux-amd64.tar.gz
cp -f /root/etcd-v3.3.10-linux-amd64/{etcd,etcdctl} /usr/bin/
package main
import (
"bufio"
"flag"
"fmt"
"log"
"net/http"
_ "net/http/pprof"
"os"
import os
import sys
def main():
line = 'x' * (int(sys.argv[1]) - 1) + '\n'
buf_mode = {'--nbf': 0, '--lbf': 1, '--fbf': 2}[sys.argv[2]]
for _ in range(10):
pid = os.fork()