Menjalankan Perintah Secara Paralel Yang Tidak Pernah Selesai

0

Saya mencoba menjalankan beberapa perintah yang tidak pernah selesai. Perintah-perintah ini menonton direktori dan memperbarui file ketika mereka berubah. Idenya adalah bahwa saya perlu beberapa folder diawasi oleh alat yang berbeda, dapat menjalankan semuanya dari satu perintah.

Untuk perintah normal yang kembali seperti yang diharapkan, pisahkan perintah dengan a ; bekerja.

ls /;
cd /;
ls var;
cd var;
ls log;
cd log

Ketika saya mencoba untuk menyatukan perintah yang tidak kembali (seperti tail -f <some_file> atau coffee -c -w <some_coffeescript_folder>, hanya perintah pertama yang akan dijalankan.

Apakah ada cara untuk melakukan ini dalam satu perintah? Inilah perintah yang saya coba tautkan bersama:

coffee -c -m -w public/javascript/*.coffee; \
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/; \
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/;
AlbertEngelB
sumber
Apa yang Anda maksud dengan "satu demi satu" jika yang pertama tidak pernah selesai? Kapan Anda ingin yang kedua dimulai?
Henning Makholm
@HenningMakholm Yang pertama tidak akan selesai. Saya hanya ingin mereka semua berlari. Saya kira secara berurutan sebenarnya tidak benar di sini, paralel akan lebih akurat. Saya telah memperbarui pertanyaan.
AlbertEngelB

Jawaban:

1

Anda dapat menjalankannya di latar belakang dengan menambahkan ampersand ke perintah:

coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &

Jika Anda ingin melihat semua pekerjaan yang sedang berjalan di latar belakang lakukan:

jobs -l

Untuk mendapatkan pekerjaan latar belakang ke latar depan, gunakan fg (PID adalah opsional):

fg <PID>

Untuk mengirim pekerjaan latar depan (yang "memblokir" shell Anda) kembali ke mode latar belakang gunakan Ctrl-Z / bg:

$ tail -f foobar.log # is "blocking" your shell
(hit Ctrl-Z)
$ bg

Saya kira pekerjaan terikat pada shell Anda dan tidak akan bercabang secara otomatis. Ini berarti jika Anda masuk melalui SSH dan Anda memutuskan, shell menerima SIGHUP, yang akan dikirim ke pekerjaan juga. Ini akan menghentikan / keluar dari perintah Anda.

Jika Anda ingin mempertahankan pekerjaan & amp; berjalan bahkan setelah Anda keluar, Anda mungkin ingin melihat "bangkai" bawaan bash:

jobs               # fetch job ID in the squre brackets
disown -h %<JOBID> # disown job by using the job ID

Opsi lain adalah "nohup" (perintah, bukan bash built-in) atau Anda menggunakan terminal multiplexer seperti "layar" atau "tmux".

Dominique Barton
sumber
Suci... Jawaban bagus, terima kasih banyak! Saya benar-benar mengatur perintah-perintah ini di Makefile yang dijagal mengerikan, tetapi ada banyak info yang tidak saya ketahui di sini. Terima kasih banyak atas jawaban terinci Anda!
AlbertEngelB
btw jika Anda ingin "menonton" direktori atau file, lihat inotify dan command-line inotify-tools github.com/rvoicilas/inotify-tools/wiki
Dominique Barton
1

Coba ini:

coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &
Cyrus
sumber
Saya benar-benar mencoba ini, tetapi saya punya tambahan ; setelah ampersand. Terima kasih!
AlbertEngelB