Menjalankan proses bash background pada Windows 10 tanpa terminal terbuka

13

Saya biasanya menggunakan subsistem linux ketika saya memprogram apa pun di Windows 10 sehingga semua jalur saya relatif terhadap ~. Saya memiliki skrip python yang berjalan selamanya di latar belakang sampai saya mematikan prosesnya. Bagaimana saya melakukannya pada Windows 10 bash tanpa terminal terbuka?

Hal yang sudah saya coba:

  • bash -c "python3 script.py dari Run.
  • nohup python3 -u script.py lalu tutup terminal.
  • setsid python3 script.py lalu tutup terminal.

Tidak ada yang berhasil. Apakah ada cara untuk melakukan ini? Atau, apakah ada cara untuk mengubah jalur sehingga mereka bekerja jika saya menjalankan skrip dari W10 DAN bash tanpa harus beralih setiap kali?

Abu
sumber

Jawaban:

7

Tambahan baru untuk WSL memungkinkan untuk memulai perintah WSL langsung dari menu 'run' atau Start. Anda dapat menambahkan tanda dan ke perintah (perilaku shell normal), yang menghasilkan bashterminal sesaat yang segera menghilang tetapi perintah terus berlanjut.

Contoh, dalam Mulai »Jalankan :

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

Jika Anda masuk ke Task Manager Windows, itu akan menampilkan perintah Sleepatau Python2berjalan selama 20 detik, kemudian membersihkan sendiri.

Satu hal yang saya temukan adalah bahwa variabel lingkungan tidak tersedia. Misalnya, DISPLAYjika diatur dalam metode normal windows, tidak diteruskan ke WSL. Untuk ini, perlu ada cara untuk lulus variabel-variabel ini. Bahkan jika perintah tidak mendukung pengaturan variabel yang diperlukan melalui argumen baris perintah, dimungkinkan untuk melakukannya dengan menggunakan bashitu sendiri:

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

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

NB: Saat ini saya menjalankan win10_64, Versi 1709 (OS Build 16299.64).

r2evans
sumber
13

Memperbarui

Microsoft telah membahas hal ini. Latar belakang / proses daemon sekarang diizinkan untuk terus berjalan bahkan setelah bash.exe(atau proses peluncur WSL lainnya) ditutup. Dibutuhkan versi terbaru dari Win10 (musim semi 2018 untuk rilis publik, versi 17046 atau lebih tinggi).

Di bawah ini dipertahankan untuk anak cucu.


Sedih / absurd, tidak ada cara untuk melakukan ini. Microsoft, dalam kebijaksanaannya yang tak terbatas, telah memutuskan bahwa WSL (Windows Subsystem untuk Linux) hanya akan berjalan ketika Anda memiliki bash.exeproses yang terbuka. Tutup yang terakhir (atau mungkin bahkan tutup jendela terakhir ; Saya tidak yakin apakah itu akan mentolerir dijalankan tanpa kepala) dan WSL dimatikan, membunuh semua prosesnya.

Pembenaran untuk ini adalah "untuk menghemat sumber daya", yang tidak masuk akal pada beberapa tingkatan yang berbeda tetapi terutama karena, sial, komputer saya memiliki sumber daya tersebut dan mereka ada di sana untuk digunakan! Jika saya ingin proses dijalankan, itu harus dijalankan; jika saya tidak ingin menjalankannya, saya bisa membunuhnya. Untuk sesuatu yang secara eksplisit dimaksudkan sebagai alat pengembang, terkadang terasa seperti WSL hanya dapat digunakan sebagai mainan dan penggunanya tidak dapat dipercaya untuk mengetahui apa yang mereka lakukan.

Bagaimanapun, jika Anda ingin ini diperbaiki, pilih untuk Pertimbangkan mengaktifkan tugas cron, daemon dan tugas latar belakang pada halaman UserVoice . Saat ini permintaan paling banyak dipilih untuk kedua, dan "ada di backlog".

CBHacking
sumber
"terutama karena, sial, komputer saya memiliki sumber daya dan mereka ada untuk digunakan" dengan sangat baik! itu benar-benar mengejutkan pikiran ...
serangan udara
Saya telah membangun 17134 dan tidak dapat memiliki pekerjaan latar belakang tanpa jendela bash.
John Pick
@JohnPick Mereka tidak akan memulai secara otomatis setelah reboot, tetapi mereka harus tetap berjalan ketika jendela ditutup (tentu saja selama mereka tidak melekat padanya, tentu saja).
CBHacking
@ CBHacking Untuk lebih spesifik, jika saya memulai server Node.js di latar belakang, maka keduanya merupakan pekerjaan ( jobs) dan proses ( ps aux). Saya bisa menggunakannya fguntuk membawanya ke latar depan. Tapi, setelah saya menutup jendela bash terakhir dan membuka jendela bash baru, pekerjaan itu hilang, prosesnya masih berjalan, dan saya tidak bisa memindahkan proses ke latar depan. Maaf jika terminologi saya tidak aktif.
John Pick
@JohnPick Ah, itu masalah yang sama sekali berbeda - pertanyaan ini adalah tentang proses, bukan tentang manajemen pekerjaan shell - dan seharusnya telah ditanyakan di tempat lain, tetapi jawabannya cukup sederhana akan saya berikan di sini: luncurkan proses di bawah tmuxatau screenuntuk mendukung melampirkan kembali ke terminal yang berbeda. Mesin Linux (dan * nix lainnya) yang berjalan secara native memiliki batasan yang sama.
CBHacking
2

Ya, itu "mustahil" saat ini.

Tetapi dimungkinkan untuk membuatnya "muncul" seperti proses latar belakang dengan beberapa tipu daya. Saya ingin fungsi ini sangat buruk, jadi setelah beberapa jam saya datang dengan solusi yang buruk tetapi bekerja.

Poin utamanya adalah membuat shell yang tidak terlihat yang Anda luncurkan WSL Bash dengan VBScript. Anda kemudian dapat menjalankan skrip tersebut saat startup. Penjadwalan Tugas yang Tepat tidak berfungsi karena alasan yang aneh.

Sisi Linux untuk mengaktifkan daemon Anda dapat memiliki sistem startup dasar Anda sendiri yang menyalahgunakan .bashrc misalnya.

Prosesnya dirinci di sini dalam dokumen ini yang saya tulis https://emil.fi/bashwin . Saya tidak menerapkan pemantauan tugas tetapi seharusnya cukup mudah diperluas.

Emil
sumber
2

Sudahkah Anda mencoba solusi ini ?

Ia menggunakan penolong WSH untuk meluncurkan aplikasi apa pun yang disembunyikan.

Kemudian Anda bisa membuat tugas baru di Tak Scheduler untuk meluncurkan perintah saat Anda login. Sesuatu sepertiwscript <path to runHidden.vbs> bash.exe -c "python script.py"

Magnus
sumber
2

Butuh waktu lama untuk saya, tetapi saya menemukan cara yang sangat rumit untuk melakukannya (dari file batch):

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

Berikut ini rincian dari apa yang dilakukannya dan mengapa:

  • `start`: untuk membuat jendela file batch hilang
  • `bash -c`: memungkinkan Anda menjalankan perintah bash
  • `DISPLAY =: 0`: mengatur X-server Anda
  • `[command]`: perintah / perintah Anda (`[perintah && [perintah]`)
  • `&`: untuk membuat perintah berikutnya berjalan setelah dimulai dan tidak ketika itu selesai
  • `sleep 0.5`: untuk memastikan proses telah dimulai
  • `&&`: untuk membuat perintah berikutnya berjalan setelah selesai dan bukan saat dijalankan
  • `kill -n 9 $$`: untuk membunuh bash shell jadi itu hanya aplikasi grafis

Catatan: DISPLAY=:0set ke x-server di :0. Untuk mengubahnya ke (mis.) :1, Lakukan DISPLAY=:1dll.

Catatan: starthanya diperlukan jika berasal dari skrip batch. Jika itu dari terminal, Anda tidak perlu ini

Catatan: sleepperlu diatur secara berbeda untuk setiap aplikasi. Anda bahkan mungkin perlu menghilangkannya.

Electroboss
sumber
0

Saya tidak tahu seberapa baik Windows Service Manager (SrvMan) dari http://tools.sysprogs.org/srvman/ akan bekerja untuk Anda, tetapi itu berhasil bagi saya untuk program lain. Bahkan, saya memang mencoba menjalankan "bash.exe" sebagai layanan untuk melihat apakah itu akan bekerja, dan saya kira saya harus bermain-main sedikit lebih banyak untuk mendapatkan LAMP untuk benar-benar bekerja di latar belakang.

Charles McDonald
sumber
1
Bagaimana ini menjawab pertanyaan tentang bagaimana menjalankan skrip Python di latar belakang?
Scott