
나는 일반적으로 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
각 애플리케이션마다 다르게 설정해야 합니다. 생략해야 할 수도 있습니다.