Jika saya menjalankan proses yang panjang, apakah ada cara saya dapat menjalankan beberapa perintah berbasis waktu?
Sebagai contoh, saya menjalankan proses yang sangat panjang yang berjalan sekitar 10 menit.
Setelah 5 menit, saya ingin menjalankan perintah terpisah. Sebagai ilustrasi, perintah terpisah dapat berupa:echo 5 minutes complete
(Catatan: Saya tidak ingin kemajuan menuju penyelesaian perintah, tetapi hanya perintah yang dieksekusi setelah interval yang ditentukan.)
Apa itu mungkin?
shell-script
shell
delay
Aniket Bhattacharyea
sumber
sumber
longcommand & sleep 300 && command-to-do-after-five-minutes
? (Sebenarnya itu mungkin yang Anda cari.) Perhatikan bahwa klarifikasi Anda tidak cukup, karena Anda mendapatkan dua implementasi clock-progress-bar langsung dari awal.Jawaban:
Lari saja:
The
do-this-after-five-minutes
akan terlindas setelah lima menit. Inilong-command
akan berjalan di latar belakang.sumber
sleep 5m && foobar
, jadi jika saya berubah pikiran dan ^ Csleep
, perintah berikutnya tidak berjalan.sleep 3; ls
dan^C
, perintah kedua tidak berjalan. Tidak begitu yakin mengapa dan mungkin ini bekerja secara berbeda dalam cangkang non-interaktif?sleep 5m && echo
tidur, saat Anda menangguhkan, hanyasleep
perintah yang ditangguhkan. Sisa dari baris perintah berjalan, tetapi karenasleep
ditangguhkan, itu tidak berhasil keluar, dan bagian setelah&&
dilewati. Coba tundasleep 5 || echo hello
, danhello
muncul langsung setelah menekan^Z
.at(1)
, untuk hal-hal sepertisleep 30m && mplayer something.mp3
pengingat alarm, atau untuksleep 90m && fg
melanjutkan perintah intensif disk nanti. Jadi sebenarnya,sleep 5m && echo hello
itu bagus karena^Z
ditangguhkansleep
tanpa menjalankan perintah berikut sama sekali. Jika Anda ingin dapat menunda / melanjutkan seluruh perintah majemuk, bahkan sebelum tidur keluar, gunakan( sleep 2 && echo hello )
.&&
Ungkapannya membuat Anda benar-benar yakin Anda tidak membunuh proses segera setelah tidur berjalan (karena Anda bisa^Z
untuk tidak menjalankan perintah, alih-alih mengambil risiko a^C
). Ini berguna dalamsleep && fg
atausleep && bg
use-case, ketika perintah yang dilanjutkan adalah bagian dari sesuatu yang lambat.Anda dapat menggunakan skrip ini:
Itu mengeksekusi Anda
longprocess
dalamsub-shell
dan kemudian memantau file 'kunci' yang dibuat sebelumnya untuk keberadaan.sumber
man bash
untukSECONDS
. Anda dapat mengaturSECONDS=0
di awal skrip dan hanya memeriksa lebih besar atau sama dengan 300 atau mengaturSECONDS=$((date +%s))
dan lupa menggunakandate
lagi di skrip Anda ...sleep 1s
selalu tepat satu detik lebih lambat daripada sebelumnyasleep 1s
... maka Anda telah menjadi korban Kepalsuan yang diprogram oleh programmer tentang waktu . (Meskipun dalam hal ini, Anda mungkin juga hanya menunjukkan tanda kemajuan tanda pagar atau sesuatu.)sleep
sama sekali!SECONDS
! :)Ada satu liner untuk ini:
Dalam kasus Anda TIMEOUT = 5m dan PERINTAH adalah perintah panjang.
Lihat jawaban saya untuk posting ini Timeout dengan 'service network restart'
sumber
jobs %1
gagal setelah pekerjaan% 1 berhenti.Perhatikan bahwa untuk waktu yang lebih lama, $ detik mungkin tidak sinkron dengan waktu nyata. Lebih baik menyimpan waktu mulai dan menghitung perbedaannya dengan waktu aktual.
sumber