Inilah yang saya butuhkan untuk terjadi:
- mulai proses A di latar belakang
- tunggu x detik
- mulai proses B di latar depan
Bagaimana saya bisa membuat penantian terjadi?
Saya melihat bahwa 'tidur' sepertinya menghentikan segalanya dan saya tidak benar-benar ingin 'menunggu' proses A selesai sepenuhnya. Saya telah melihat beberapa loop berdasarkan waktu tetapi saya bertanya-tanya apakah ada sesuatu yang lebih bersih.
sleep
menghentikan proses-A? Bisakah Anda menunjukkan proses pengujian yang Anda gunakan, atau menampilkan indikasi ini? Jika proses-A adalah tersendat-sendat, itu lebih mungkin bahwa itu mencoba membaca dari terminal sementara berjalan di latar belakang dan mendapatkan dihentikan karena alasan itu, bukan sesuatu yang berhubungan dengansleep
.process_a </dev/null &
akan melampirkan stdin untuk/dev/null
daripada TTY, dan yang mungkin cukup untuk menghindari masalah tersebut.Jawaban:
Kecuali jika saya salah memahami pertanyaan Anda, itu bisa dicapai dengan skrip pendek ini:
(dan tambahkan tambahan
wait
di bagian akhir jika Anda ingin skrip Anda menungguprocess_a
hingga selesai sebelum keluar).Anda bahkan dapat melakukan ini sebagai satu-liner, tanpa perlu skrip (seperti yang disarankan oleh @BaardKopperud):
sumber
bash
untuk itu, shell apa pun akan termasuk sistem Andash
, jadi Anda tidak perlu menambahkan ketergantungan pada bash untuk skrip Anda.Anda dapat menggunakan operator kontrol latar belakang (&) untuk menjalankan proses di latar belakang dan
sleep
perintah untuk menunggu sebelum menjalankan proses kedua, yaitu:Berikut adalah contoh dari dua perintah yang mencetak beberapa pesan bertanda waktu:
Jalankan untuk memverifikasi bahwa ia menunjukkan perilaku yang diinginkan:
sumber
Saya suka jawaban @ dr01 tetapi dia tidak memeriksa kode keluar dan jadi Anda tidak tahu apakah Anda berhasil atau tidak.
Inilah solusi yang memeriksa kode keluar.
biasanya saya menyimpan PID dalam array bash dan kemudian memeriksa pid adalah untuk loop.
sumber
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
berjalan di latar depan. Agaknyaprocess_a
bisa keluar saatprocess_b
sedang berjalan, tetapi Anda masih bisawait
untuk itu dan mendapatkan status keluar setelah Anda mengumpulkan status keluar dari latar depanprocess_b
dengan cara biasa, dengan$?
langsung.