lxc exec:探索其独特魅力
导读 | 最近,我对 lxc exec 进行了几个改进。如果你不知道它的话我介绍一下,lxc exec 是 LXD 的客户端工具,使用 LXD 客户端 api 与 LXD 守护程序通信,并执行用户想要执行的各种程序,以下是你可以使用的一个例子: |
我们的主要目标之一就是使 lxc exec 与 ssh 类似,因为它是交互式或非交互式远程运行命令的标准。这使得 把 lxc exec 做得很好变得有点棘手。
1、 处理后台任务一个长期存在的问题当然是如何正确处理后台任务。这是一个关于 LXD 2.7 实例的问题的例子:
你可以看到,在后台执行任务将导致 lxc exec 无法退出。许多命令可以触发此问题:
chb@conventiont|~ > lxc exec zest1 bash root@zest1:~# yes & y y y . . .
现在没有什么能救你了。yes 将会永远直接写入stdout。
问题的根源在于 stdout 是一直打开着的,但这是必要的,因为它用以确保用户所启动的进程写入的任何数据实际上都是通过我们建立的 websocket 连接读取并发回的。
假如你想这样,运行一个 shell 会话,然后在后台运行一个进程,并马上退出 shell。对不起,它并不能如预期那样。
第一种并且原始的方法是一旦你检测到前台程序(例如 shell)已经退出就直接关闭 stdout。但这不像想得那么好,当你运行快速执行程序时,这个问题会变得明显,比如:
lxc exec -- ls -al /usr/lib
这里 lxc exec 进程(和相关的 forkexec 进程。但现在不要考虑它,只要记住 Go + setns() 不相往来就行了……)会在 stdout 中所有的缓冲数据被读取之前退出。这种情况下将会导致截断输出,没有人想要这样。在尝试使用几个方法来解决问题之后,包括禁用 pty 缓冲(我告诉你,这不太漂亮,也没有如预期工作。)和其他奇怪的思路,我设法通过几个 poll() “技巧”(在某种意义上说一个“技巧”)解决了这个问题。现在你终于可以运行后台任务,并且可以完全退出了。如图:
ssh 是一个很棒的工具。但有一件事,我一直以来不喜欢当 ssh 运行的命令接收到一个信号时, ssh 总是会报告 -1,也就是退出码 255。当你想要了解导致程序终止的信号时,这很烦人。这就是为什么我最近实施标准 shell 所使用的惯例 128 + n 来报告任何由信号导致的退出,其中 n 被定义为导致执行程序退出的信号量。例如,在 SIGKILL 信号上,你会看到 128 + SIGKILL = 137(计算其他致命信号的退出码作为读者的练习)。所以你可以这么做:
chb@conventiont|~ > lxc exec zest1 sleep 100
现在,将 SIGKILL 发送到执行程序(不是 lxc exec本身,因为 SIGKILL 不可转发)。
kill -KILL $(pidof sleep 100)
最后检查你程序的退出码:
chb@conventiont|~ > echo $? 137
瞧。这显然只有当 a) 退出码没有超过 8 位计算壁垒,b)当执行程序不使用 137 来表示成功(这可真……有趣?!)。这两个论点似乎对我来说都不太有说服力。前者因为致命信号量不应该超过这个范围。后者因为(i)这是用户问题,(ii)这些退出代码实际上是保留的(我是这样认为。),(iii)你在本地或其他上面运行程序时会遇到同样的问题。
我看到的主要优点是这能够回报执行程序细粒度的退出状态。注意,我们不会报告所有被信号杀死的程序实例。比如说,当你的程序能够处理 SIGTERM 并且完全退出时,LXD 没有简单的方法来检测到这个情况并报告说这个程序被信号杀死了。你只会简单地收到退出码 0。
3、 转发信号这可能不太有趣(或者也许不是,谁知道呢),但我发现它非常有用。正如你在 SIGKILL 案例中看到的那样,我明确地指出,必须将 SIGKILL 发送到执行程序,而不是 lxc exec命令本身。这是因为 SIGKILL 在程序中无法处理。程序可以做的唯一的事情就是去死,像现在这样……像这个例子……马上(你明白了了吧……)。但是程序可以处理很多其他信号 SIGTERM、SIGHUP',当然也可以处理SIGUSR1和SIGUSR2。因此,当你发送可以被lxc exec` 处理而不是被执行程序处理的信号时,较新版本的 LXD 会将信号转发到执行进程。这在脚本中非常方便。
无论如何,我希望你觉得这篇小小的 lxc exec 文章/胡言乱语有用。享受 LXD 吧,这是与一只疯狂的美丽的野兽玩耍。请试试在线实验:https://linuxcontainers.org/lxd/try-it/,对于开发人员看看这里:https://github.com/lxc/lxd 并给我们补丁。
我们不要求签署任何 CLA,我们遵循内核风格,只要其中有 “Signed-off-by” 这行就好。
以上是lxc exec:探索其独特魅力的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Docker 进程查看方法:1. Docker CLI 命令:docker ps;2. Systemd CLI 命令:systemctl status docker;3. Docker Compose CLI 命令:docker-compose ps;4. Process Explorer(Windows);5. /proc 目录(Linux)。

VS Code 系统要求:操作系统:Windows 10 及以上、macOS 10.12 及以上、Linux 发行版处理器:最低 1.6 GHz,推荐 2.0 GHz 及以上内存:最低 512 MB,推荐 4 GB 及以上存储空间:最低 250 MB,推荐 1 GB 及以上其他要求:稳定网络连接,Xorg/Wayland(Linux)

VS Code扩展安装失败的原因可能包括:网络不稳定、权限不足、系统兼容性问题、VS Code版本过旧、杀毒软件或防火墙干扰。通过检查网络连接、权限、日志文件、更新VS Code、禁用安全软件以及重启VS Code或计算机,可以逐步排查和解决问题。

VS Code 可以在 Mac 上使用。它具有强大的扩展功能、Git 集成、终端和调试器,同时还提供了丰富的设置选项。但是,对于特别大型项目或专业性较强的开发,VS Code 可能会有性能或功能限制。

VS Code 全称 Visual Studio Code,是一个由微软开发的免费开源跨平台代码编辑器和开发环境。它支持广泛的编程语言,提供语法高亮、代码自动补全、代码片段和智能提示等功能以提高开发效率。通过丰富的扩展生态系统,用户可以针对特定需求和语言添加扩展程序,例如调试器、代码格式化工具和 Git 集成。VS Code 还包含直观的调试器,有助于快速查找和解决代码中的 bug。

虽然 Notepad 无法直接运行 Java 代码,但可以通过借助其他工具实现:使用命令行编译器 (javac) 编译代码,生成字节码文件 (filename.class)。使用 Java 解释器 (java) 解释字节码,执行代码并输出结果。

Linux的主要用途包括:1.服务器操作系统,2.嵌入式系统,3.桌面操作系统,4.开发和测试环境。Linux在这些领域表现出色,提供了稳定性、安全性和高效的开发工具。

Visual Studio Code (VSCode) 是一款跨平台、开源且免费的代码编辑器,由微软开发。它以轻量、可扩展性和对众多编程语言的支持而著称。要安装 VSCode,请访问官方网站下载并运行安装程序。使用 VSCode 时,可以创建新项目、编辑代码、调试代码、导航项目、扩展 VSCode 和管理设置。VSCode 适用于 Windows、macOS 和 Linux,支持多种编程语言,并通过 Marketplace 提供各种扩展。它的优势包括轻量、可扩展性、广泛的语言支持、丰富的功能和版
