Sistem antrian sederhana?

10

Diberikan PC komoditas, kami ingin menggunakannya untuk menjalankan beberapa tugas di latar belakang sepanjang waktu.

Pada dasarnya, kami ingin memiliki perintah seperti:

add-task *insert command here*
list-tasks
remove-task(s)

Tugas yang ditambahkan hanya harus dimasukkan ke dalam antrian dan dieksekusi satu demi satu di latar belakang (tetap berjalan setelah keluar dari shell).

Apakah ada skrip / program sederhana yang melakukan ini?

dagnelies
sumber

Jawaban:

7

Ada batchperintah standar yang melakukan kurang lebih apa yang Anda cari. Lebih tepatnya, batchmenjalankan pekerjaan ketika beban sistem tidak terlalu tinggi, satu per satu (sehingga tidak melakukan paralelisasi). The batchPerintah merupakan bagian dari atpaket.

echo 'command1 --foo=bar' | batch      
echo 'command2 "$(wibble)"' | batch
at -q b -l              # on many OSes, a slightly shorter synonym is: atq -q b
at -q b -r 1234         # Unschedule a pending task (atq gives the task ID)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Itu salah untuk mengatakan bahwa batchperintah "tidak melakukan paralelisasi". Biasanya ada penundaan 60 detik default antara memulai satu pekerjaan dan memulai berikutnya; namun, tidak ada yang membuat pekerjaan berikutnya menunggu yang pertama selesai - atdakan dengan senang hati memulai pekerjaan dari antrean batch segera setelah nilai yang ditentukan oleh -bopsi telah berlalu (lihat atdhalaman manual).
rsaw
Batch tidak secara ketat membuat serialisasi tugas, jadi jika Anda memiliki satu sumber daya bersama, jawaban @sitaram (pengumpul tugas) harus bekerja lebih baik.
ergosys
5

Solusi lain adalah menggunakan lpd, dan membuat "driver cetak" khusus yang menjalankan pekerjaan Anda. Seorang teman membantu saya mengatasi hal ini ketika saya memiliki permintaan serupa. Buat skrip seperti ini, dan masukkan /tmp/batch.sh:

#!/bin/bash

TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE

Lalu lari:

lpadmin -p batch1 -E -P /tmp/batch.sh

Itu mulai antrian, dan Anda bisa membuat lebih banyak dengan menggunakan nama lain, bukan batch1. Tambahkan pekerjaan dengan:

lp -d batch1 /path/to/jobscript

Mengelola pekerjaan dengan lpq, lprm, dan lpstat. Jika Anda menginginkan lebih banyak fleksibilitas dengan meneruskan argumen ke pekerjaan Anda, Anda dapat membuat skrip batch.sh lebih menarik.

(Saya mencoba batchsebelum turun rute ini, tetapi entah itu tidak berfungsi sebagai antrian di OSX, atau saya salah menggunakannya.)

Joe Fusion
sumber
Saya menyadari bahwa @arnaud menentukan "PC komoditas," yang berarti mungkin bukan OSX, tempat saya menguji solusi ini. Namun, ini harus portabel, dan ini jauh lebih fleksibel daripada batch.
Joe Fusion
1
Ini mungkin salah satu peretasan paling asli yang pernah saya lihat.
Thiago Macedo
Sayangnya, ini tidak lagi berfungsi. github.com/apple/cups/commit/…
wdkrnls
4

Ada banyak sistem antrian, tetapi sering kali sangat khusus.

Anda mungkin melihat atpenjadwal. Ini seperti crondalam beberapa hal tetapi pengaturan lebih seperti antrian untuk pekerjaan satu kali daripada untuk pekerjaan yang berulang. Itu dapat "menjadwalkan" hal-hal pada kriteria selain waktu, seperti beban sistem atau urutan pekerjaan.

Distro favorit Anda hampir pasti memiliki paket untuk itu.

Caleb
sumber
2

Saya perhatikan pertanyaan ini berumur beberapa tahun, jadi mungkin tidak membantu poster aslinya, tetapi mungkin membantu orang lain.

Pertama: "task spooler" adalah jawabannya. Ini cukup kuat dan Fedora setidaknya memilikinya.

Tetapi banyak dari server yang saya gunakan, saya tidak dapat menginstal paket arbitrer tanpa banyak kerumitan, jadi saya memerlukan sesuatu yang idealnya murni bash (atau perl, atau semacamnya).

Setelah berjuang dengan ini untuk sementara waktu, saya datang dengan implementasi bash murni yang tampaknya berfungsi dengan baik sejauh ini. Anda dapat menemukannya di https://github.com/sitaramc/bq .

Ini hanya satu skrip bash sehingga pemasangannya sepele. Namun, ini memenuhi persyaratan kedua dan ketiga Anda (tetapi itu juga sepele untuk menerapkannya juga).

Script dikomentari secara bebas dan Anda harus dapat memeriksanya dalam beberapa menit jika Anda mau.

sitaram
sumber
paket debian adalah task-spooler, executable adalah "tsp" bukan "ts" yang bertabrakan dengan sesuatu yang lain. Saya menyukainya juga karena Anda dapat menyusun ulang tugas yang ada dalam antrian, Anda tidak dapat melakukannya dengan di / batch.
ergosys