내보낸 변수는 터미널에서 작동하지만 쉘 스크립트에서는 작동하지 않습니다.

내보낸 변수는 터미널에서 작동하지만 쉘 스크립트에서는 작동하지 않습니다.

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가 항상 저장되므로 이는 쉽습니다.

관련 정보