導出變數在終端中有效,但在 shell 腳本中無效
我在 Ubuntu 焦點上並試圖開始
VBoxManage list vms
使用不同的配置目錄。這可以通過更改(或設置)來實現
VBOX_USER_HOME
,並且如果我只需鍵入以下內容,它在終端中效果很好:export VBOX_USER_HOME="/new/config/path" VBoxManage list vms
但是,當我從 bash 腳本嘗試相同的程式碼時:
#!/bin/bash export VBOX_USER_HOME="/new/config/path" echo "$VBOX_USER_HOME" env | grep VBOX_USER_HOME VBoxManage list vms
該變數沒有被“看到”,
VBoxManage
因此它列出了在預設位置配置的 VM,即使該變數顯然已成功導出到 env。以下是輸出的樣子:/new/config/path VBOX_USER_HOME=/new/config/path lists the machines from default config
我知道這
/usr/bin/vboxmanage
是一個最終呼叫真正應用程序的腳本的連結$INSTALL_DIR/VBoxManage
。只是為了確保 VBox 腳本不會清理環境,我嘗試直接呼叫二進製文件。然而,這並沒有什麼不同。那麼,
$INSTALL_DIR/VBoxManage
當我從終端執行導出時,導出的變數是如何可見的,但當我從腳本中執行導出時卻不可見?修正: 我剛剛發現這是 Virtual Box 的某種競爭條件問題。如果我在終端中進行導出並
$INSTALL_DIR/VBoxManage list vms
隨後直接執行,它會錯誤地顯示預設配置中的虛擬機,就像腳本一樣。隨後的呼叫總是返回舊列表隨後的呼叫會在 5 到 10 秒後顯示新列表。如果我執行導出並稍等片刻,列表將正確更新為在新位置配置的 VM。後續呼叫現在總是返回新列表。所以我的問題的解決方案是在腳本中插入一個睡眠。無論如何,我會獎勵可以解釋這種意外行為的答案。
我曾經在這裡遇到完全相同的問題,因為我的機器上有 2 個磁碟 - 一個小型 SSD 磁碟
/
(現在升級到 1 TB,因此不再那麼小了)和一個用於數據的大型 HDD。由於 SSD 磁碟空間不足,我將所有虛擬機都保存在巨大的 HDD 上。我發現執行vboxmanage list vms
2個與Virtualbox相關的程序後出現:$ ps aux | grep -i '[V]irt' ja 29172 0.0 0.1 36084 11240 ? S 21:17 0:00 /usr/lib64/virtualbox/VBoxXPCOMIPCD ja 29178 1.0 0.2 523564 21256 ? Sl 21:17 0:00 /usr/lib64/virtualbox/VBoxSVC --auto-shutdown
它們在一段時間後終止,大約 20 秒。Virtualbox 手冊中描述了這些過程:
5.7.6。VBoxSVC IPC 問題
在 Linux 上,Oracle VM VirtualBox 使用自定義版本的 Mozilla XPCOM(跨平台組件對像模型)進行程序間和程序內通信 (IPC)。程序 VBoxSVC 充當不同 Oracle VM VirtualBox 程序之間的通信中心,並維護全域配置,例如 XML 數據庫。啟動 Oracle VM VirtualBox 組件時,會自動啟動程序 VBoxSVC 和 VBoxXPCOMIPCD。它們只能從執行它們的使用者帳戶訪問。VBoxSVC 擁有 Oracle VM VirtualBox 配置數據庫,該數據庫通常位於 ~/.config/VirtualBox 或您的作業系統的相應配置目錄中。在執行時,配置文件被鎖定。各種 Oracle VM VirtualBox 組件和 VBoxSVC 之間的通信是通過位於 /tmp/.vbox-username-ipc 中的本地域套接字執行的。如果存在通信問題,例如 Oracle VM VirtualBox 應用程序無法與 VBoxSVC 通信,請終止守護程序並刪除本地域套接字目錄。
確實,顯示了程序
cat /tmp/.vbox-$(whoami)-ipc/lock
的PID 。VBoxXPCOMIPCD
這就是問題的根本原因。現在,我還沒有發現任何提及這一點,
vboxmanage --help
所以我認為你不能輕易繞過它。你可能總是想VBoxXPCOMIPCD
在使用前殺死vboxmanage
,這很容易做到,因為 PID 總是被保存的。