Açık bir terminal olmadan Windows 10'da bir bash arkaplan işlemini çalıştırma


11

Windows 10'da bir şey programlarken genellikle linux alt sistemini kullanıyorum, bu yüzden tüm yollarım göreceli ~. Süreci öldürene kadar arka planda sonsuza dek süren bir python betiğim var. Açık bir terminal olmadan Windows 10 bash'ta bunu nasıl yapardım?

Denedim şeyler:

  • bash -c "python3 script.py Run.
  • nohup python3 -u script.py sonra terminali kapatın.
  • setsid python3 script.py sonra terminali kapatın.

Bunların hiçbiri işe yaramadı. Bunu yapmanın bir yolu var mı? Alternatif olarak, yolları her seferinde değiştirmek zorunda kalmadan senaryoyu W10 AND bash'ta çalıştırırsam çalışacakları şekilde değiştirmenin bir yolu var mı?

Yanıtlar:


6

WSL'ye yeni eklenen, wsl komutlarının doğrudan "çalıştır" veya Başlat menüsünden başlatılmasına izin verir. Komuta bir amper işareti ekleyebilir (normal kabuk davranışı), bashbu hemen kaybolan anlık bir terminalle sonuçlanır, ancak komut devam eder.

İçinde örnekleri Başlangıç »Run :

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

Windows Görev Yöneticisi'ne girerseniz, 20 saniye boyunca çalışan bir Sleepveya Python2komutunu gösterir , ardından kendi kendini temizler.

Bulduğum şeylerden biri, ortam değişkenlerinin mevcut olmadığı. Örneğin, DISPLAYpencereler normal yöntem olarak ayarlanırsa, WSL geçirilir değildir. Bunun için bu değişkenleri geçmenin bir yolu olmalı. Komut gerekli değişkeni bir komut satırı argümanı ile ayarlamayı desteklemese bile, bashkendisini kullanarak yapmak mümkündür :

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

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

Not: Şu anda win10_64, Sürüm 1709 (OS Build 16299.64) kullanıyorum.


12

Güncelleştirme

Microsoft bunu ele aldı. Arkaplan / arka plan işlemleri artık bash.exe(veya diğer WSL başlatıcısı işlemi) kapatıldıktan sonra bile çalışmaya devam etmesine izin verilir . Yeni bir Win10 yapısı (kamuya açık yayınlar için 2018 baharı, 17046 veya daha büyük bir yapı) gereklidir.

Aşağıda posterity için korunmuştur.


Ne yazık ki / saçma, bunu yapmanın yolu yok. Microsoft, sonsuz bilgeliklerinde, WSL'nin (Linux için Windows Alt Sistemi) yalnızca bir bash.exeişlem açıkken çalışacağına karar vermiştir . Sonuncuyu kapatın (veya son pencereyi kapatın ; hatta kafasız çalışmayı tolere edip edemeyeceğinden emin değilim) ve WSL kapanır, tüm işlemlerini öldürür.

Bunun nedeni, birkaç farklı seviyede saçma olan ama en önemlisi, bilgisayarımın bu kaynaklara sahip olması ve kullanılmaları için olması nedeniyle “kaynakları korumak” idi. Bir sürecin çalışmasını istiyorsam, çalışması gerekir; Çalışmasını istemiyorsam, öldürebilirim. Bir geliştirici aracı olarak açıkça tasarlanan bir şey için, bazen WSL'nin yalnızca bir oyuncak olarak kullanılabildiğini ve kullanıcılarının ne yaptıklarını bilmeleri için güvenilemeyeceğini düşünüyor.

Her neyse, sizin için bu sabit oylamayı istiyorsanız cron işleri, cinleri ve arka plan görevlerini sağlayan düşünün üzerinde UserVoice sayfası . Şu anda ikinci en çok oy alan istek, ve "beklemede".


"en önemlisi, çünkü kahretsin, bilgisayarım bu kaynaklara sahip ve kullanmaya hazırlar" çok iyi ifade edildi! gerçekten akıllara boggles ...
Andy Terra

Ben 17134 inşa ettim ve bir bash pencere olmadan bir arka plan işi olamaz.
John Pick

@JohnPick Yeniden başlattıktan sonra otomatik olarak başlatılmazlar, ancak pencere kapalıyken çalışmaya devam etmeleri gerekir (tabii ki bağlı değillerse).
CBHack

@CBHacking Daha açık olmak gerekirse, arka planda bir Node.js sunucusu başlattığımda, hem bir iş ( jobs) hem de bir işlem ( ps aux). Onu fgön plana çıkarmak için kullanabilirim. Ancak, son bash penceresini kapatıp yeni bir bash penceresini açtıktan sonra, iş bitti, işlem hala devam ediyor ve işlemi ön plana taşıyamıyorum. Terminolojim kapalıysa üzgünüm.
John

@JohnPick Ah, bu tamamen farklı bir konudur - bu soru, kabuk işi yönetimi ile ilgili değil, süreçlerle ilgilidir - ve başka bir yerde sorulmuş olmalı, ancak cevap burada vereceğim kadar basit: Burada işlemi başlatmak tmuxveya screendesteklemek farklı bir terminale tekrar bağlama. Yerel olarak çalışan Linux (ve diğer * nix) makineler aynı sınırlamaya sahiptir.
CBHack

2

Evet, şu an "imkansız".

Ancak, bazı hile ile bir arka plan işlemi gibi "görünmesi" mümkündür. Bu işlevselliği kendim için çok fena istedim, bu yüzden birkaç saat sonra boktan ama çalışan bir çözüm buldum.

Ana nokta, WSL Bash'i VBScript ile başlattığınız görünmez bir kabuk oluşturmaktır. Daha sonra bu betiğin başlangıçta çalıştırılmasını sağlayabilirsiniz. Doğru Görev Çizelgeleme garip bir nedenden dolayı işe yaramadı.

Linux tarafında daemonları etkinleştirmek için, örneğin .bashrc'yi kötüye kullanan kendi basit başlangıç ​​sisteminize sahip olabilirsiniz.

İşlem burada bu belgede detaylandırılmış https://emil.fi/bashwin yazdım . Görev izlemeyi uygulamadım ama genişletmek oldukça kolay olmalı.


1

Bu çözümü denediniz mi?

Gizli herhangi bir uygulamayı başlatmak için bir WSH yardımcı kullanır.

Ardından, oturum açtığınızda komutu başlatmak için Tak Scheduler uygulamasında yeni bir görev oluşturabilirsiniz. Gibi bir şeywscript <path to runHidden.vbs> bash.exe -c "python script.py"


0

Http://tools.sysprogs.org/srvman/ adresinden Windows Service Manager'ın (SrvMan) ne kadar iyi çalıştığını bilmiyorum , ama diğer programlar için benim için çalıştı. Aslında, işe yarayıp yaramadığını görmek için bir hizmet olarak "bash.exe" yi çalıştırmayı denedim ve sanırım LAMP'in arka planda çalışmasını sağlamak için biraz daha etrafa göz atmam gerekiyor.


1
Bu, bir Python betiğini arka planda çalıştırma sorusunu nasıl ele almaktadır?
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.