Saya memiliki skrip bash yang terlihat seperti berikut:
##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done
Saya ingin membuat yang lain untuk loop setelah yang pertama untuk melanjutkan selama 30. Misalnya
##script
#!/bin/bash
rm data*
rm logfile*
for i in {1..30}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
for i in {31..60}
do
## append a & if you want to run it parallel;
nohup Rscript --vanilla main.R 10 100 $i &> logfile"$i" &
done
Saya ingin set pekerjaan pertama selesai sebelum memulai set baru. Tetapi karena nohup
itu tampaknya mereka semua berjalan secara bersamaan.
Saya punya nohup
karena saya login ke server saya dari jauh dan memulai pekerjaan di sana dan kemudian menutup pesta saya. Apakah ada solusi alternatif?
wait
builtin.Jawaban:
Anda akan ingin menggunakan
wait
perintah untuk melakukan ini untuk Anda. Anda dapat menangkap semua ID proses anak-anak dan menunggu mereka secara khusus, atau jika mereka adalah satu-satunya proses latar belakang yang dibuat skrip Anda, Anda dapat memanggilwait
tanpa argumen. Sebagai contoh:sumber
Beberapa poin:
Jika tujuan Anda
nohup
adalah untuk mencegah keluarnya shell jarak jauh dari membunuh proses pekerja Anda, Anda harus menggunakannohup
script itu sendiri, bukan pada proses pekerja individu yang dibuatnya.Seperti yang dijelaskan di sini ,
nohup
hanya mencegah proses dari menerima SIGHUP dan dari berinteraksi dengan terminal, tetapi tidak memutuskan hubungan antara shell dan proses anaknya.Karena poin di atas, dengan atau tanpa
nohup
, sederhanawait
antara duafor
loop akan menyebabkan yang keduafor
dieksekusi hanya setelah semua proses anak dimulai oleh yang pertamafor
telah keluar.Dengan sederhana
wait
:Jika Anda perlu menjalankan yang kedua
for
hanya jika tidak ada kesalahan di yang pertama, maka Anda harus menyimpan masing-masing PID pekerja$!
, dan meneruskannya kewait
:sumber
R
ataucc1plus
dalamtop
perintahwait
menyebabkanbash
menunggu pekerjaan latar belakang yang ditimbulkannya sendiri, tidak ada yang lain. Mungkin ada beberapa kebingungan di sini -for
loop ini , apakah Anda menyimpannya ke file dan memanggilnya sebagai skrip (apa yang saya asumsikan, karena##script
baris), atau apakah Anda mengetiknya dengan tangan di terminal?Gunakan
fg
builtin. Ia menunggu sampai proses latar belakang selesai.Coba
help fg
untuk detailnya.sumber
Jika Anda memasukkan sesuatu seperti segmen kode berikut di antara dua
for
loop Anda, itu mungkin membantu.Tentu saja, jika aplikasi Anda
Rscript
memiliki kesempatan untuk tidak menyelesaikan dengan sukses dan berlama-lama, putaran kedua Anda untuk loop mungkin tidak memiliki kesempatan untuk dijalankan. Segmen kode di atas mengasumsikan, semua proses dengan pengenalRscript --vanilla
akan lengkap dan hilang dengan benar. Tanpa mengetahui apa yang dilakukan aplikasi Anda dan cara kerjanya, saya harus mengandalkan asumsi ini.EDIT
Mengingat komentar, ini akan lebih sesuai dengan kebutuhan Anda. (itu termasuk kode asli Anda serta logika pemeriksaan penyelesaian)
sumber
top
acaraR
terkadang atau ataucc1plus
.ps -ef
daftar. Atau setelah setiapnohup
perintah, catat PID ke suatu variabel (lebih disukai sebuah array) denganecho ${!}
dan memeriksa grup PID ini. Ketika semuanya hilang, Anda dapat melanjutkan kefor
loop kedua