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)

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)

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

VS Code 可以在 Mac 上使用。它具有強大的擴展功能、Git 集成、終端和調試器,同時還提供了豐富的設置選項。但是,對於特別大型項目或專業性較強的開發,VS Code 可能會有性能或功能限制。

Visual Studio Code (VSCode) 是一款跨平台、開源且免費的代碼編輯器,由微軟開發。它以輕量、可擴展性和對眾多編程語言的支持而著稱。要安裝 VSCode,請訪問官方網站下載並運行安裝程序。使用 VSCode 時,可以創建新項目、編輯代碼、調試代碼、導航項目、擴展 VSCode 和管理設置。 VSCode 適用於 Windows、macOS 和 Linux,支持多種編程語言,並通過 Marketplace 提供各種擴展。它的優勢包括輕量、可擴展性、廣泛的語言支持、豐富的功能和版

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。
