容器信号使用

kubernetes各版本离线安装包

容器信号使用

我们跑在容器中的程序通常想在容器退出之前做一些清理操作,比较常用的方式是监听一个信号,延迟关闭容器。

docker提供了这样的功能:

╰─➤  docker stop --help

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers

Options:
      --help       Print usage
  -t, --time int   Seconds to wait for stop before killing it (default 10)

docker 1.13以上版本在创建容器时可直接指定STOPTIMEOUT 和STOPSIGNAL参数:

$ docker run --help
...
--stop-signal string                    Signal to stop a container, SIGTERM by default (default "SIGTERM")
--stop-timeout int                      Timeout (in seconds) to stop a container
...

但是。。。

我们测试一个:

package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    fmt.Println("signal test")
    go func() {
        for {
            c := make(chan os.Signal, 1)
            signal.Notify(c, syscall.SIGTERM)
            s := <-c
            fmt.Println("Got signal:", s)
        }
    }()
    time.Sleep(time.Second * 100)
}

Dockerfile:

FROM dev.reg.iflytek.com/base/golang:1.8.0
COPY main.go .
RUN go build -o signal && cp signal $GOPATH/bin
CMD signal  

构建:

docker build -t dev.reg.iflytek.com/test/signal:latest .

运行:

docker run --name signal dev.reg.iflytek.com/test/signal:latest

再开一终端,运行:

docker stop -t 10 signal

发现并没有打印出Got signal:... 监听信号失败。

问题再于:我们docker inspect signal看一下可以看到

Path:/bin/sh
Args:[
  -c,
  signal
]

或者docker exec signal ps 看一下可以看到pid为1的进程并不是signal, 而是shell.

所以原因找到了,是因为docker engine只给pid为1的进程发送信号,sh收到了信号而我们想要的signal进程没有收到信号

解决办法:

FROM dev.reg.iflytek.com/base/golang:1.8.0
COPY main.go .
RUN go build -o signal && cp signal $GOPATH/bin
CMD ["signal"]  # 不能写成 CMD signal, 这会直接exec,否则会以shell的方式派生子进程。

扫码关注sealyun探讨可加QQ群:98488045

### 关于 VSCode 中外部容器信号灯插件的配置与调试 在开发环境中,VSCode 提供了丰富的功能来支持开发者对外部设备(如 LCD 显示器、信号灯等)进行配置和调试。以下是关于如何在 VSCode 中配置或调试与信号灯相关的外层容器设置的相关说明。 #### 1. 安装必要的扩展 为了实现对信号灯的支持,通常需要安装一些特定的扩展工具。这些工具可以帮助开发者更方便地管理硬件接口并与之交互。例如,“Platform IO” 是一个非常流行的用于嵌入式开发的扩展[^3]。它能够提供强大的编译、上传和调试功能,适用于多种微控制器平台。 #### 2. 配置串口通信 对于许多涉及信号灯的应用场景来说,通过串口发送指令是一种常见的方式。因此,在 VSCode 的 `settings.json` 文件中可以添加如下配置项以指定默认使用的 COM 端口号以及波特率: ```json { "platformio-ide.serialport": { "defaultPort": "/dev/ttyUSB0", "baudRate": 9600 } } ``` 上述代码片段展示了如何设定串行端口及其传输速率[^4]。需要注意的是实际路径可能因操作系统不同而有所差异;Linux 下一般为 `/dev/ttyUSB*` 或者 `/dev/ttyACM*` ,而在 Windows 上则通常是类似于 `COM3` 这样的命名方式。 #### 3. 编写驱动逻辑 针对具体的项目需求编写相应的软件部分也是必不可少的一环。假设我们要控制某个 LED 灯亮灭,则可以在 Arduino IDE 兼容模式下创建一个新的草图(Sketch),并利用 digitalWrite 函数完成基本的操作: ```cpp void setup() { pinMode(13, OUTPUT); // 设置数字针脚 13 作为输出 } void loop() { digitalWrite(13, HIGH); // 将LED点亮 delay(1000); // 延迟一秒 digitalWrite(13, LOW); // 把LED熄灭 delay(1000); } ``` 此段 C++ 程序定义了一个简单的循环动作序列——每隔一秒钟切换一次状态[^5]。当然这只是一个基础例子,具体应用还需依据实际情况调整算法细节。 #### 4. 使用 Debug Adapter Protocol (DAP) Visual Studio Code 支持基于 DAP 协议的各种调试适配器,这对于深入分析运行期间出现问题特别有用。比如当我们怀疑 WIIF 模块未能正常启动是因为固件存在缺陷时,就可以借助 gdbserver 来远程跟踪目标板上的执行流程[^6]: ```bash target remote :3333 load /path/to/firmware.bin continue ``` 以上命令先连接到监听地址 ":3333" 的 GDB Server 实例上加载新的镜像文件后再继续执行直到遇到断点为止。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值