エクスポートされた変数は端末では機能しますが、シェルスクリプトでは機能しません。

エクスポートされた変数は端末では機能しますが、シェルスクリプトでは機能しません。

Ubuntu Focusを使用しており、起動しようとしています。

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

変数がenvに正常にエクスポートされたにもかかわらず、変数は「表示」されないため、デフォルトの場所VBoxManageに設定されたVMが一覧表示されます。出力は次のとおりです。

/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に正しく更新されます。今後の呼び出しは常に新しいリストを返します。したがって、私の問題に対する解決策は、スクリプトに睡眠を挿入することです。とにかく、この予期しない動作を説明する答えに補償します。

ベストアンサー1

/私のコンピュータには、2台のディスク、つまりデータ用の小型SSDディスク(現在は1TBにアップグレードされたため、これ以上小さくなりません)とデータHDD用の大型SSDディスクがあるのと同じ問題が発生しました。 SSDディスク容量が不足しているため、すべての仮想マシンを巨大なHDDに保存します。vboxmanage list vms実行後、Virtualboxに関連する2つのプロセスが表示されることがわかりました。

$ 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秒)後に終了します。これらのプロセスについては後述する。バーチャルボックスマニュアル:

5.7.6。 VBoxSVC IPCの問題

Linuxでは、Oracle VM VirtualBoxはプロセス間通信(IPC)にMozilla XPCOM(Cross-Platform Component Object Model)のカスタムバージョンを使用します。 VBoxSVCプロセスは、さまざまなOracle VM VirtualBoxプロセス間の通信センターとして機能し、XMLデータベースなどのグローバル構成を維持します。 Oracle VM VirtualBoxコンポーネントを起動すると、VBoxSVCおよびVBoxXPCOMIPCDプロセスが自動的に起動します。実行されているユーザーアカウントからのみアクセスできます。 VBoxSVCは通常、オペレーティングシステムの対応する構成ディレクトリにある~/.config/VirtualBoxまたはOracle VM 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は常に保存されるので、これは簡単です。

おすすめ記事