Saya memiliki program yang melakukan banyak pekerjaan (membutuhkan sekitar 4-5 jam) yang dimulai oleh cron ketika semua data yang digunakannya tersedia. Kadang-kadang, ketika saya menunggu sampai selesai, saya ingin dapat memulai (interaktif) program lain ketika selesai. panggilan tunggu terlihat menjanjikan tetapi hanya akan menunggu anak-anak.
shell-script
process
Hildred
sumber
sumber
ipc
komunikasi interprocess.man ipc
.Jawaban:
Saya lebih suka solusi EDIT # 3 (lihat di bawah).
jika tidak dalam shell yang sama, gunakan loop sementara dengan kondisi pada ps -p mengembalikan true. Letakkan tidur di loop untuk mengurangi penggunaan prosesor.
atau jika UNIX Anda mendukung / proc (misalnya HP-UX masih tidak).
Jika Anda ingin batas waktu
EDIT # 1
Ada cara lain: jangan gunakan cron . Gunakan perintah batch untuk menumpuk pekerjaan Anda.
Misalnya Anda bisa setiap hari menumpuk semua pekerjaan Anda. Batch dapat disetel untuk memungkinkan beberapa paralelisme sehingga pekerjaan yang diblokir tidak akan menghentikan semua tumpukan (Itu tergantung pada sistem operasi).
EDIT # 2
Buat fifo di direktori home Anda:
di akhir pekerjaan Anda:
di awal pekerjaan lain (orang yang menunggu):
Ini bukan polling, itu sudah lama memblokir IO.
EDIT # 3
Menggunakan sinyal:
Di awal skrip, siapa yang menunggu:
di akhir pekerjaan panjang Anda:
sumber
Anda dapat memodifikasi pekerjaan cron Anda untuk menggunakan beberapa flag.
Dari pada
Anda dapat gunakan
Dan pantau saja file ini dalam skrip atau bahkan secara manual. Jika ada, maka program Anda sedang berjalan; jika tidak merasa bebas untuk melakukan apa pun yang Anda inginkan.
Sampel skrip:
Jika Anda tidak suka menggunakan
sleep
, Anda dapat memodifikasi skrip dan menjalankannya melalui cron sekali per X menit.Dalam hal contoh skrip akan:
Cara ini sedikit lebih mudah, karena Anda tidak harus menemukan PID dari proses cron Anda.
sumber
Tidak ada fasilitas untuk proses untuk menunggu proses lain selesai, kecuali untuk orang tua menunggu salah satu proses anaknya selesai. Jika bisa, luncurkan program melalui skrip:
Jika Anda tidak dapat melakukan itu, misalnya sebelum Anda ingin memulai sejumlah besar pekerjaan dari cron job tetapi program interaktif dari konteks sesi Anda, maka buat ini
Ada beberapa cara untuk mengimplementasikannya
notify_completion
. Beberapa lingkungan desktop menyediakan mekanisme pemberitahuan ( Buka jendela pada tampilan X jarak jauh (mengapa "Tidak dapat membuka layar")? Mungkin bermanfaat). Anda juga dapat membuatnya menggunakan pemberitahuan perubahan file. Di Linux, fasilitas pemberitahuan perubahan file tidak valid .Untuk bereaksi terhadap penciptaan
/path/to/finished.stamp
:Jika Anda tidak dapat mengubah cara
do_large_amount_of_work
dipanggil, tetapi Anda tahu file apa yang dimodifikasi terakhir, Anda dapat menggunakan mekanisme yang sama untuk bereaksi ketika file itu ditutup. Anda juga dapat bereaksi terhadap peristiwa lain seperti penggantian nama file (lihatinotifywait
manual untuk daftar kemungkinan).sumber
Biarkan skrip dipicu oleh cronjob untuk memanggil skrip shell kosong tempat Anda dapat memasukkan tugas tindak lanjut jika Anda membutuhkannya.
Ini sangat mirip dengan pendekatan Gilles.
cronjob-task.sh
mengandung:di mana
post-execute.sh
biasanya kosong, kecuali Anda melihat bahwa Anda perlu memicu tugas tindak lanjut.sumber