열린 터미널없이 Windows 10에서 bash 백그라운드 프로세스 실행


13

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

내가 시도한 것 :

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

이 중 어느 것도 효과가 없었습니다. 이 방법이 있습니까? 또는 매번 전환 할 필요없이 W10에서 스크립트를 실행하고 bash를 실행하면 경로를 변경하는 방법이 있습니까?

답변:


7

WSL에 최근 추가 된 기능은 'run'또는 Start 메뉴에서 직접 wsl 명령을 시작할 수 있습니다. 앰퍼샌드를 명령 (일반 쉘 동작)에 추가하면 순간 bash터미널이 즉시 사라지지만 명령은 계속됩니다.

시작»실행 내의 예 :

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

Windows의 작업 관리자로 이동하면 20 초 동안 실행 되는 Sleep또는 Python2명령 이 표시 되고 자체 삭제됩니다.

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

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

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

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


13

최신 정보

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

아래는 후손을 위해 보존되어 있습니다.


슬프게도 / 당연히, 이것을 할 수있는 방법이 없습니다. Microsoft는 무한한 지혜로 bash.exe프로세스가 열려 있는 동안에 만 WSL (Linux for Windows Subsystem)을 실행하기로 결정했습니다 . 마지막 창을 닫습니다 (또는 마지막 창을 닫을 수도 있습니다 . 헤드리스를 허용하는지 확실하지 않습니다). WSL이 종료되어 모든 프로세스가 종료됩니다.

이것에 대한 타당성은 "자원을 보존하는 것"이었다. 이것은 몇 가지 다른 수준에서 터무니 없지만, 특히 컴퓨터에 그러한 자원이 있고 사용될 수 있기 때문에 가장 주목할 만하다! 프로세스를 실행하려면 실행해야합니다. 실행하고 싶지 않으면 죽일 수 있습니다. 개발자 도구로 명시 적으로 의도 된 것의 경우 WSL이 놀이 용으로 만 사용 가능하고 사용자가 자신이하는 일을 신뢰할 수없는 것처럼 느껴집니다.

어쨌든이 고정을 원하면 UserVoice 페이지 에서 cron 작업, 데몬 및 백그라운드 작업 사용고려 하십시오 . 현재 두 번째로 투표가 많은 요청이며 "백 로그에 있습니다".


"가장 주목할만한 것은, 내 컴퓨터에는 그러한 리소스가 있고 사용하기 위해 거기에있다"는 것입니다. 그것은 정말로 마음을 혼란스럽게한다 ...
airstrike

빌드 17134가 있으며 bash 창이 없으면 백그라운드 작업을 수행 할 수 없습니다.
존 픽

@JohnPick 재부팅 후 자동으로 시작되지 않지만 창을 닫을 때 (물론 연결되어 있지 않은 한) 실행 상태를 유지해야합니다.
CBHacking

@CBHacking 좀 더 구체적으로, 백그라운드에서 Node.js 서버를 시작하면 작업 ( jobs) 및 프로세스 ( ps aux)입니다. fg포 그라운드로 가져올 수 있습니다 . 그러나 마지막 bash 창을 닫고 새 bash 창을 연 후에는 작업이 중단되고 프로세스가 여전히 실행 중이며 프로세스를 포 그라운드로 이동할 수 없습니다. 내 용어가 꺼져 있으면 죄송합니다.
John Pick

이 질문은하지 쉘 작업 관리에 대한 프로세스에 관한 것입니다 - - 완전히 다른 문제입니다 @JohnPick 아, 그리고 다른 질문을 주어야한다고 대다수가 생각하지만, 대답은 간단만큼 내가 여기를주지되어 출시에게 과정을 아래 tmux또는 screen지원 다른 터미널에 다시 연결하십시오. 기본적으로 실행되는 Linux (및 기타 * nix) 시스템에는 동일한 제한이 있습니다.
CBHacking

2

네, 지금은 불가능합니다.

그러나 약간의 속임수가있는 백그라운드 프로세스처럼 "표시"되도록 할 수 있습니다. 나는이 기능을 꽤 나쁘게 원했기 때문에 몇 시간이 지나면 칙칙하지만 작동하는 해결책을 찾았습니다.

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

데몬을 사용하기 위해 리눅스 쪽에서는 예를 들어 .bashrc를 남용하는 초보적인 시작 시스템을 가질 수 있습니다.

프로세스는 여기 https://emil.fi/bashwin을 작성한이 문서에서 자세히 설명합니다 . 작업 모니터링을 구현하지 않았지만 확장하기가 쉬워야합니다.


2

솔루션 을 사용해 보셨습니까 ?

WSH 도우미를 사용하여 숨겨진 응용 프로그램을 시작합니다.

그런 다음 Tak Scheduler에서 새 작업을 생성하여 로그인 할 때 명령을 시작할 수 있습니다. 같은 것wscript <path to runHidden.vbs> bash.exe -c "python script.py"


2

그것은 나를 영원히 데려 갔지만 (배치 파일에서) 어리석게 복잡한 방법을 발견했습니다.

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

다음은 그 기능과 이유에 대한 분석입니다.

  • `start` : 배치 파일 창이 사라지도록
  • `bash -c` : bash 명령을 실행할 수 있습니다
  • `DISPLAY = : 0` : X 서버를 설정합니다
  • `[명령]`: 명령 / 명령 (`[명령 && [명령]`)
  • `및`: 그것은 한 후 다음 명령을 실행할 수 있도록하기 시작 하고이있어하지 않을 때 수행
  • `sleep 0.5` : 프로세스가 시작되었는지 확인
  • `&&`: 그것은 한 후 다음 명령을 실행할 수 있도록하는 이 때 아닌 시작
  • `kill -n 9 $$`: bash 쉘을 죽이기 위해서는 그래픽 응용 프로그램 일뿐입니다.

참고 : DISPLAY=:0에서 x 서버로 설정하십시오 :0. (예)로 변경하려면 다음을 :1수행하십시오 DISPLAY=:1.

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

참고 : sleep응용 프로그램마다 다르게 설정해야합니다. 당신은 그것을 생략해야 할 수도 있습니다.


0

http://tools.sysprogs.org/srvman/의 Windows 서비스 관리자 (SrvMan)가 얼마나 잘 작동하는지 잘 모르겠지만 다른 프로그램에서는 효과가 있습니다. 실제로 "bash.exe"를 서비스로 실행하여 작동하는지 확인하려고했지만 실제로 백그라운드에서 LAMP가 작동하도록하려면 조금 더 고민해야합니다.


1
이것은 백그라운드에서 파이썬 스크립트를 실행하는 방법에 대한 질문을 어떻게 해결합니까?
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.