업데이트

업데이트

나는 일반적으로 Windows 10에서 무엇이든 프로그래밍할 때 Linux 하위 시스템을 사용하므로 모든 경로는 ~. 프로세스를 종료할 때까지 백그라운드에서 영원히 실행되는 Python 스크립트가 있습니다. 열린 터미널 없이 Windows 10 bash에서 어떻게 이를 수행할 수 있습니까?

내가 시도한 것들:

  • bash -c "python3 script.py실행에서.
  • nohup python3 -u script.py그런 다음 터미널을 닫습니다.
  • setsid python3 script.py그런 다음 터미널을 닫습니다.

이들 중 어느 것도 작동하지 않았습니다. 이를 수행할 수 있는 방법이 있습니까? 또는 매번 경로를 전환할 필요 없이 W10 및 bash에서 스크립트를 실행하면 경로가 작동하도록 경로를 변경할 수 있는 방법이 있습니까?

답변1

최근 WSL에 추가되어 '실행' 또는 시작 메뉴에서 직접 wsl 명령을 시작할 수 있습니다. 명령에 앰퍼샌드를 추가할 수 있습니다(일반적인 쉘 동작). 그러면 bash즉시 사라지지만 명령은 계속되는 순간 터미널이 생성됩니다.

예, 이내시작 » ​​실행:

wsl sleep 20 &
wsl python -c 'import time; time.sleep(20);' &

Windows 작업 관리자에 들어가면 20초 동안 실행 중인 Sleep또는 Python2명령이 표시된 후 자동으로 지워집니다.

내가 찾은 한 가지는 환경 변수를 사용할 수 없다는 것입니다. 예를 들어 DISPLAY, Windows 일반 방법으로 설정하면 WSL로 전달되지 않습니다. 이를 위해서는 이러한 변수를 전달하는 방법이 필요합니다. 명령이 명령줄 인수를 통해 필요한 변수 설정을 지원하지 않더라도 bash자체적으로 수행할 수 있습니다.

# direct, command-dependent
wsl emacs --display=:0 &

# indirect, more flexible
wsl bash -c "DISPLAY=:0 emacs" &

주의: 저는 현재 win10_64, 버전 1709(OS 빌드 16299.64)를 실행하고 있습니다.

답변2

업데이트

Microsoft는 이 문제를 해결했습니다. 이제 백그라운드/데몬 프로세스는 bash.exe(또는 다른 WSL 실행 프로그램 프로세스) 닫힌 후에도 계속 실행될 수 있습니다 . Win10의 최신 빌드(공개 릴리스의 경우 2018년 봄, 빌드 17046 이상)가 필요합니다.

아래 내용은 후손을 위해 보존됩니다.


슬프게도/불합리하게도, 이를 수행할 방법이 없습니다. Microsoft는 무한한 지혜를 바탕으로 프로세스가 열려 있는 동안에만 WSL(Linux용 Windows 하위 시스템)이 실행되도록 결정했습니다 bash.exe. 마지막 항목을 닫습니다(또는 마지막 항목도 닫을 수 있음).창문; 헤드리스 실행을 허용할지 잘 모르겠습니다) WSL이 종료되어 모든 프로세스가 종료됩니다.

이것에 대한 정당성은 "자원을 보존하기 위한 것"이었습니다. 이는 여러 가지 측면에서 터무니없지만 가장 주목할만한 것은 젠장, 내 컴퓨터에 그러한 자원이 있고 그것들이 사용되기 위해 존재하기 때문입니다! 프로세스를 실행하려면 실행해야 합니다. 실행되는 것을 원하지 않으면 죽일 수 있습니다. 명시적으로 개발자 도구로 의도된 것의 경우 WSL은 장난감으로만 사용할 수 있고 사용자는 자신이 무엇을 하고 있는지 알 수 없다고 느낄 수 있습니다.

어쨌든 이 문제를 해결하려면 다음에 투표하세요.크론 작업, 데몬, 백그라운드 작업 활성화를 고려하세요.~에UserVoice 페이지. 현재 두 번째로 많은 표를 받은 요청이며 "백로그에" 있습니다.

답변3

네, 현재로서는 '불가능'합니다.

그러나 약간의 속임수를 사용하여 백그라운드 프로세스처럼 "나타나게" 하는 것이 가능합니다. 나는 이 기능을 매우 원했기 때문에 몇 시간 후에 형편없지만 작동하는 솔루션을 생각해 냈습니다.

주요 요점은 VBScript를 사용하여 WSL Bash를 시작하는 보이지 않는 셸을 만드는 것입니다. 그러면 시작 시 해당 스크립트가 실행되도록 할 수 있습니다. 이상한 이유로 적절한 작업 예약이 작동하지 않았습니다.

Linux 측에서는 데몬을 활성화하기 위해 예를 들어 .bashrc를 남용하는 기초적인 시작 시스템을 가질 수 있습니다.

프로세스는 내가 작성한 이 문서에 자세히 설명되어 있습니다.https://emil.fi/bashwin. 작업 모니터링을 구현하지 않았지만 확장이 매우 쉬울 것입니다.

답변4

시간이 오래 걸렸지만 (배치 파일에서) 어리석게도 복잡한 방법을 찾았습니다.

start bash -c "DISPLAY=:0 [command] & (sleep 0.5 && kill -n 9 $$)"

그 기능과 이유는 다음과 같습니다.

  • `start`: 배치 파일 창을 사라지게 만듭니다.
  • `bash -c`: bash 명령을 실행할 수 있습니다.
  • `DISPLAY=:0`: X 서버를 설정합니다.
  • `[command]`: 명령/명령(`[command && [command]`)
  • `&`: 다음 명령이 그 뒤에 실행되도록 합니다.시작하다그리고 그럴 때는 아니야완료
  • `sleep 0.5`: 프로세스가 시작되었는지 확인합니다.
  • `&&`: 다음 명령이 실행된 후에 실행되도록 합니다.완료그리고 그럴 때는 아니야시작하다
  • `kill -n 9 $$`: bash 쉘을 종료하여 그래픽 애플리케이션만 사용하도록 합니다.

참고: DISPLAY=:0에서 x-server로 설정합니다 :0. (예를 들어)로 변경하려면 등을 :1수행하십시오 .DISPLAY=:1

참고: start배치 스크립트에서 가져온 경우에만 필요합니다. 터미널에서 오는 경우에는 필요하지 않습니다.

참고: sleep각 애플리케이션마다 다르게 설정해야 합니다. 생략해야 할 수도 있습니다.

관련 정보