導讀 | # 最近,我對 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中文網其他相關文章!

多年來,Linux軟件分佈依賴於DEB和RPM等本地格式,並深深地根深蒂固。 但是,Flatpak和Snap已經出現,有望成為應用程序包裝的通用方法。 本文考試

Linux和Windows在處理設備驅動程序上的差異主要體現在驅動管理的靈活性和開發環境上。 1.Linux採用模塊化設計,驅動可以動態加載和卸載,開發者需深入理解內核機制。 2.Windows依賴微軟生態,驅動需通過WDK開發並簽名認證,開發相對複雜但保證了系統的穩定性和安全性。

Linux和Windows的安全模型各有優勢。 Linux提供靈活性和可定制性,通過用戶權限、文件系統權限和SELinux/AppArmor實現安全。 Windows則注重用戶友好性,依賴WindowsDefender、UAC、防火牆和BitLocker保障安全。

Linux和Windows在硬件兼容性上不同:Windows有廣泛的驅動程序支持,Linux依賴社區和廠商。解決Linux兼容性問題可通過手動編譯驅動,如克隆RTL8188EU驅動倉庫、編譯和安裝;Windows用戶需管理驅動程序以優化性能。

Linux和Windows在虛擬化支持上的主要區別在於:1)Linux提供KVM和Xen,性能和靈活性突出,適合高定制環境;2)Windows通過Hyper-V支持虛擬化,界面友好,與Microsoft生態系統緊密集成,適合依賴Microsoft軟件的企業。

Linux系統管理員的主要任務包括系統監控與性能調優、用戶管理、軟件包管理、安全管理與備份、故障排查與解決、性能優化與最佳實踐。 1.使用top、htop等工具監控系統性能,並進行調優。 2.通過useradd等命令管理用戶賬戶和權限。 3.利用apt、yum管理軟件包,確保系統更新和安全。 4.配置防火牆、監控日誌、進行數據備份以確保系統安全。 5.通過日誌分析和工具使用進行故障排查和解決。 6.優化內核參數和應用配置,遵循最佳實踐提升系統性能和穩定性。

學習Linux並不難。 1.Linux是一個開源操作系統,基於Unix,廣泛應用於服務器、嵌入式系統和個人電腦。 2.理解文件系統和權限管理是關鍵,文件系統是層次化的,權限包括讀、寫和執行。 3.包管理系統如apt和dnf使得軟件管理方便。 4.進程管理通過ps和top命令實現。 5.從基本命令如mkdir、cd、touch和nano開始學習,再嘗試高級用法如shell腳本和文本處理。 6.常見錯誤如權限問題可以通過sudo和chmod解決。 7.性能優化建議包括使用htop監控資源、清理不必要文件和使用sy


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

Dreamweaver CS6
視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。