콘솔에서 WSL 다시 시작

콘솔에서 WSL 다시 시작

WSL 콘솔에서 현재 WSL 인스턴스를 다시 시작하려면 어떻게 해야 하나요?

일반적인 "용의자"는 작동하지 않습니다.

reboot
shutdown -r

다음 메시지와 함께 실패합니다.

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

WSL을 강제로 다시 시작하는 다른 방법이 있나요?

답변1

cmdWindows를 통해 또는 다음 명령을 사용하여 powershell이 작업을 수행 해야 합니다 .

> wsl --shutdown

인스턴스 수가 많고 특정 인스턴스나 배포판을 종료해야 하는 경우 다음을 사용할 수 있습니다.

> wsl -l -v

릴리스 이름, 상태(실행 중 또는 중지 여부) 및 wsl버전을 확인하고 사용하세요.

> wsl -t NAME

답변2

다음은 Linux의 Windows 11에서 WSL2를 사용하는 경우에 적용됩니다.

sudo poweroff -f

이는 SystemD와 같은 것을 통해 수행하려고 시도하지 않고 Linux 커널을 직접 종료합니다 init.

시간이 좀 걸릴 수 있으니 주의하세요(최소 8초하지만 인스턴스가 다시 시작될 때까지 1분 동안 지켜봤습니다. 동시에 인스턴스에 액세스하려고 하면 다음과 같은 내용이 관찰됩니다(이 역시 독일어 Windows 설치에서 가져온 것이며 Windows 터미널도 독일어로 설정되어 있습니다).

Schwerwiegender Fehler
Error code: Wsl/Service/E_UNEXPECTED

[Verarbeitung des Prozesses mit Code 4294967295 (0xffffffff) beendet]

괜찮아요. 그냥 앉아서 기다렸다가 다시 시도해 보세요.

궁금하다면:

strace poweroff -f

어떻게 작동하는지 보여줍니다. 표시되는 마지막 몇 줄은 다음과 같습니다.

sync()                                  = 0
reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_CAD_ON) = -1 EINVAL (Invalid argument)
writev(2, [{iov_base="Powering off.", iov_len=13}, {iov_base="\n", iov_len=1}], 2Powering off.
) = 14
reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_POWER_OFF) = ?
+++ exited with 0 +++

[Verarbeitung des Prozesses mit Code 1 (0x00000001) beendet]

답변3

먼저, WSL에서 Linux 배포판을 실행할 때 실제 머신이나 가상 머신에서 실행하는 것과는 다르다는 점을 이해하는 것이 중요합니다. 실제로 여러분이 있는 것은 Docker 또는 대부분의 다른 컨테이너 시스템(네임스페이스, cgroup 등)과 유사한 기술을 사용하는 컨테이너입니다.

WSL 배포판을 "종료"하려는 것은 Docker/Podman/기타 컨테이너를 "종료"하려는 것과 같습니다. Ubuntu가 Docker에서 실행 중인 경우 Ubuntu 내에서 종료할 필요는 없지만 다음 방법 중 하나로 종료할 수 있습니다.

  • docker stop컨테이너 외부에서 명령 실행
  • 또는 컨테이너 내에서 실행 중인 모든 프로세스를 종료하세요.

WSL도 마찬가지다. 당신은 할 수 있습니다:

  • 배포판에서 실행 중인 모든 프로세스를 중지하고 대화형 셸을 종료하면 WSL은 15초 후에 배포 자체를 종료해야 합니다. 그러나 Docker Desktop은 백그라운드 프로세스가 계속 실행되기 때문에 모든 배포가 계속 실행된다는 점에 유의하세요.

  • 강제 배포 종료. 이 작업은 일반적으로 PowerShell 또는 CMD를 통해 수행되지만 wsl --terminate <distroname>다음에서 수행할 수도 있습니다.~에배포 용도:

    wsl.exe --terminate $WSL_DISTRO_NAME
    
  • WSL 시스템을 완전히 종료합니다 wsl --shutdown. 마찬가지로 WSL 내에서는 확장명이 포함된 전체 실행 파일 이름을 사용해야 합니다 wsl.exe --shutdown.

또는--terminate--shutdown배포를 중단하세요. 이것은아니요우아한 종료. 실행 중인 모든 프로세스는 정상적인 신호에 응답할 기회 없이 즉시 종료됩니다.

정상적인 종료를 위해(내 AU 답변에서 복사됨)여기), Windows 11의 최신 WSL 버전에 따르면할 수 있는지금시스템 실행. WSL2에서 Systemd가 시작한 서비스는 다음과 같은 상황에서 자동으로 종료됩니다.다른 프로세스 없음(기본적으로 Systemd에서 시작한 것을 제외하고) 모두 Ubuntu에서 실행됩니다.

이번 생산 중단아름다운. WSL2는 Systemd와 통신하여 (일반적인 Systemd 신호 동작을 통해) 그 아래에서 실행 중인 모든 서비스를 정상적으로 중지합니다.

WSL을 동시에 실행하려면 백그라운드에서 추가 프로세스("대화형" 시작)를 실행해야 하므로 이것이 반드시 최적인 것은 아닙니다. 바라보다이 답변이를 수행하는 방법에 대한 솔루션입니다. 내가 언급한 것과 같은 것을 사용하는 경우 keychain프로세스를 중지하고( keychain -k all) Ubuntu에서 셸을 종료하면 약 15초 내에 WSL2가 Systemd에 "정상 종료" 신호를 보내야 합니다.

관련 정보