Cara mengirim banyak perintah ke shell dan menunggu perintah di belakang berakhir [ditutup]

16

Saya memiliki sekitar 20 perintah dan saya harus mengirim semua ini ke Unix shell dan menyalin hasilnya, tetapi saya tidak tahu bagaimana melakukannya.

Saya tidak yakin dengan shell apa yang saya miliki, karena ini adalah program kecil yang terhubung ke Mobile Network Managment, dan dengan program kecil ini kami memiliki akses untuk mengirim perintah per baris dan menerima hasilnya dengan berteriak, karena alasan itu saya tidak dapat menggunakan skrip untuk mengirim perintah.

Perintah 1 - Terhubung dengan server.

Tunggu hingga perintah 1 selesai

Perintah 2 - Perbarui semua informasi dari server 1 selesai

Tunggu.

Perintah 3 . Dapatkan beberapa parameter.

... dan lebih banyak lagi perintah semacam itu.

Saya mencoba dengan cmd1 | cmd2 | cmd3 dan cmd1 & cmd2 & cmd3 dancmd1;cmd2

Masalahnya adalah dengan cmd1terhubung ke RNC (elemen Jaringan) dan membutuhkan waktu 15 detik, setelah itu cmd2masuk akal. tetapi hanya bekerja untuk cmd pertama. Ada petunjuk, bagaimana menjalankan ini?

Jonathan Raul Tapia Lopez
sumber
3
Gunakan skrip? Atau &&antar perintah.
Bernhard

Jawaban:

20

Biasanya hanya cmd1;cmd2;cmd3;cmd4(jika Anda ingin menulisnya di satu baris), atau menggunakan cmd1 && cmd2 && cmd3 && cmd4jika Anda tidak ingin menjalankan cmd3 ketika cmd2 gagal.

Atau ;Anda hanya dapat menulis satu perintah per baris.

cmd1
cmd2
cmd3
cmd4

Jika Anda ingin perintah dijalankan secara paralel di latar belakang, Anda juga dapat menggunakan

cmd1 &
cmd2 &
cmd3 &
cmd4 &
wait # for cmd1-4 to finish

Salah satu dari metode tersebut juga dapat dimasukkan ke dalam skrip shell. Ada sedikit perbedaan antara apa yang Anda tulis di skrip shell dan apa yang Anda tulis di shell itu sendiri.

frostschutz
sumber
MM masalahnya ketika saya mengirim cmd1 itu benar-benar harus menyelesaikan sekitar 6 detik, masalah ketika mengirim cmd2 dan cmd1 masih memproses gagal.
Jonathan Raul Tapia Lopez
4
Dalam hal cmd1;cmd2ini (atau cmd1 && cmd2dalam hal ini) cmd2 tidak akan berjalan sampai cmd1 telah keluar (dan dengan demikian mungkin selesai). Jadi seharusnya tidak ada masalah - tolong ulangi pertanyaan Anda, atau berikan contoh bahwa orang benar-benar dapat mereproduksi.
frostschutz
Ok saya akan memodifikasi pertanyaan. terima kasih
Jonathan Raul Tapia Lopez
2

Anda mungkin ingin melihat ke dalam sleep, jika lingkungan Anda mengizinkannya. Urutan lengkapnya kemudian akan menjadi seperti cmd1 && sleep 10s && cmd2.
Ini adalah halaman manual yang relevan untuk tidur .

LoicAG
sumber
sleep / waiting hanya berguna jika Anda secara deterministik tahu berapa lama program sebelumnya (yang mungkin memunculkan proses berlatar belakang) untuk menyelesaikan dan keluar (IE The Halting Problem) ATAU jika Anda menjamin bahwa Anda ingin menyela dan menjalankan perintah kedua Anda setelah interval. telah berlalu, yang mungkin terjadi jika keduanya tidak sinkron tetapi Anda masih ingin beberapa waktu di antara keduanya. Kemungkinan besar, itu bukan yang Anda inginkan. Secara praktis, itu mungkin berhasil. Tapi itu tidak bisa diandalkan.
Justin Reeves
1

Cukup gunakan skrip, file yang berisi perintah untuk menjalankan satu demi satu, seperti:

#!/bin/sh

command-01
command-02
...
command-20

Baris pertama (shebang) memberitahu untuk menjalankan perintah berikut menggunakan /bin/sh, membuat file executable ( chmod u+x your-little-script) maka Anda dapat menjalankannya ./my-little-script. Dengan cara ini Anda tidak akan meninggalkan beberapa langkah ;-)

Baca manual untuk shell, ini menyediakan bahasa pemrograman lengkap. Periksa bash(1)apakah itu yang tersedia, atau yang lain shell Korn ksh(1). Mereka menawarkan banyak fitur yang berguna untuk mengendalikan aliran kontrol dalam skrip (atau secara interaktif, dalam hal ini).

vonbrand
sumber
Terima kasih tapi saya tidak bisa menggunakan scritps.
Jonathan Raul Tapia Lopez
Mengapa? Bagaimanapun, kecuali ini adalah lingkungan yang sangat fasis, Anda harus dapat sumber skrip: source your-little-script(atau . your-little-scriptsingkatnya).
vonbrand
Karena, saya tidak langsung mengakses sistem unix yang saya miliki seperti program mini yang hanya mengizinkan untuk mengeksekusi cmd dalam baris dan mendapatkan hasilnya dengan berteriak, dan untuk penggunaan saya akan menggunakan perintah ini tidak praktis untuk menggunakan skrip.
Jonathan Raul Tapia Lopez
OK, itu mengklarifikasi hal-hal sedikit ... Lingkungan apa asal / tujuan dari perintah Anda? Apa yang Anda gunakan untuk mengirimkan perintah untuk dieksekusi? Apa itu lingkungan terpencil? Apa pengaturan Anda di sana (apakah Anda memiliki akun reguler, yang dapat Anda akses melalui sshatau PuTTYmungkin?
vonbrand
-1

Anda dapat menjalankan sesuatu seperti expectpada komputer lokal Anda untuk mengirim cmd1dan menunggu sampai selesai sebelum mengeluarkan cmd2dll. Anda harus mengetahui periode yang wajar untuk menunggu, atau output spesifik yang menunjukkan bahwa perintah dilakukan, untuk menulis yang tepat Skrip yang diharapkan.

Tentu saja, cmd1; cmd2; cmd3; cmd4dalam satu perintah akan menjalankan perintah secara berurutan, satu demi satu.

tripleee
sumber