Saya perlu banyak menyalin berbagai file ke berbagai folder. Saya dapat menambahkan semua perintah salin saya ke skrip bash dan kemudian menjalankannya, tetapi kemudian saya harus menunggu sampai selesai jika saya ingin menambahkan lebih banyak perintah ke "antrian" penyalinan itu.
Apakah ada cara saya bisa menjalankan perintah sebagai antrian dan semacam menambahkan lebih banyak perintah ke antrian itu sementara semuanya berjalan?
Dijelaskan dengan cara yang berbeda, saya ingin memulai tugas yang berjalan lama. Sementara itu sedang berjalan saya ingin memulai yang lain yang tidak benar-benar mulai sampai yang pertama selesai. Dan kemudian tambahkan yang lain setelah yang terakhir dan seterusnya. Apakah ini mungkin?
Jawaban:
The
at
utilitas, paling dikenal untuk menjalankan perintah pada waktu tertentu, juga memiliki fitur antrian dan dapat diminta untuk mulai menjalankan perintah sekarang. Bunyinya perintah untuk menjalankan dari input standar.The
batch
perintah setara denganat -q b -m now
(-m
yang berarti output perintah, jika ada, akan dikirimkan kepada Anda, seperti cron tidak). Tidak semua varian unix mendukung nama antrian (-q myqueue
); Anda mungkin terbatas pada satu antrian yang dipanggilb
. Linuxat
terbatas pada nama antrian huruf tunggal.sumber
now
tidak-t now
, maaf. Saya tidak memperhatikan bahwa saya salah dalam kode sampel.Tambahkan
&
ke akhir perintah Anda untuk mengirimnya ke latar belakang, dan kemudianwait
di atasnya sebelum menjalankan berikutnya. Sebagai contoh:sumber
wait
? Tampaknya tahan terhadap semua pembunuhan saya.wait
hanya berhenti pekerjaan sampai yang sebelumnya selesai.nohup
?Solusi Brad dan Mankoff adalah saran yang bagus. Yang lain yang mirip dengan kombinasi keduanya adalah dengan menggunakan Layar GNU untuk mengimplementasikan antrian Anda. Ini memiliki keuntungan karena dapat dijalankan di latar belakang, Anda dapat memeriksanya kapan saja, dan mengantre perintah baru hanya menempelkannya ke buffer yang akan dieksekusi setelah perintah sebelumnya keluar.
Lari pertama:
(kebetulan, sekarang adalah waktu yang tepat untuk bermain dengan beberapa file screenrc . )
Itu akan memunculkan sesi layar latar belakang untuk Anda bernama antrian.
Sekarang, antreikan sebanyak mungkin perintah yang Anda suka:
Saya melakukan beberapa perintah di atas hanya untuk pengujian. Kasing penggunaan Anda mungkin akan lebih mirip:
Perhatikan bahwa "^ M" pada baris saya di atas adalah cara untuk mendapatkan baris baru tertanam yang akan ditafsirkan nanti setelah layar memasukkannya ke dalam bash shell yang ada. Gunakan "CTL-V," untuk mendapatkan urutan itu.
Akan sangat mudah untuk membuat beberapa shell-script sederhana untuk mengotomatiskannya dan mengantri perintah. Kemudian, setiap kali Anda ingin memeriksa status antrian latar belakang Anda, Anda lampirkan kembali melalui:
Secara teknis, Anda bahkan tidak perlu menyebutkan nama sesi layar Anda dan itu akan berfungsi dengan baik, tetapi begitu Anda terhubung dengannya, Anda tetap ingin membiarkannya tetap berjalan sepanjang waktu. ;-)
Tentu saja, jika Anda melakukannya, cara lain yang baik untuk melakukannya adalah dengan memberi nama salah satu jendela "antrian" dan menggunakan:
sumber
Ada sebuah utilitas yang saya gunakan dengan sukses besar untuk persis use case yang Anda gambarkan. Baru-baru ini saya memindahkan laptop utama saya ke perangkat keras baru, yang melibatkan pemindahan beberapa file ke NAS dan sisanya ke mesin baru.
Beginilah cara saya melakukannya.
Atur semua mesin yang terlibat dengan koneksi jaringan sehingga mereka dapat saling menjangkau.
Pada mesin tempat Anda memindahkan file (selanjutnya disebut mesin sumber), instal rsync with
apt-get install rsync
dan Spooler Task -sauce rahasia (situs web http://vicerveza.homeunix.net/~viric/soft/ts/ ). Jika Anda menggunakan Debian nama paket untukts
istask-spooler
dan executable diganti namanyatsp
untuk menghindari bentrokan nama dengants
executable darimoreutils
paket. Paket Debian yang ditautkan dari situs web dapat diinstal dengan sempurna pada Ubuntu dengandpkg -i task-spooler_0.7.3-1_amd64.deb
atau serupa.Pastikan juga semua mesin memiliki SSH terinstal
apt-get install openssh-server
. Pada mesin sumber, Anda perlu mengatur SSH untuk memungkinkan login tanpa kata sandi ke mesin target. Metode yang paling banyak digunakan adalah otentikasi kunci publik denganssh-agent
(lihat https://www.google.se/search?q=ssh+public+key+authentication untuk contoh-contoh itu), tetapi kadang-kadang saya menggunakan metode yang lebih mudah yang hanya berfungsi juga dengan otentikasi kata sandi. Tambahkan yang berikut ini ke konfigurasi klien SSH Anda (salah satu~/.ssh/config
atau/etc/ssh/ssh_config
):Kemudian buka satu terminal di mesin sumber, login dengan
ssh target1
, otentikasi seperti biasa, dan kemudian biarkan terminal ini terbuka. Perhatikan bahwa ada file socket bernama~/.ssh/master-user@target1:22
, ini adalah file yang akan membuat sesi master tetap otentik terbuka dan memungkinkan koneksi tanpa kata sandi berikutnya untukuser
(selama koneksi menggunakan nama host dan port target yang sama).Pada titik ini Anda perlu memverifikasi bahwa Anda dapat masuk tanpa diminta untuk otentikasi ke mesin target.
Sekarang jalankan
ts rsync -ave ssh bigfile user@target1:
untuk satu file atauts rsync -ave ssh bigdir user@target1:
untuk direktori. Dengan rsync, penting untuk tidak menyertakan garis miring pada direktori (bigdir
dibandingkan denganbigdir/
) atau rsync akan menganggap bahwa maksud Anda sama denganbigdir/*
di sebagian besar alat lainnya.Task Spooler akan mengembalikan prompt dan membiarkan Anda mengantri banyak dari perintah ini secara berurutan. Periksa antrian jalankan dengan
ts
tanpa argumen.Task Spooler memiliki banyak fitur seperti menata ulang antrian proses, menjalankan pekerjaan tertentu hanya jika pekerjaan lain berjalan dengan sukses, dll. Lihat bantuan dengan
ts -h
. Saya kadang-kadang memeriksa output perintah ketika sedang berjalan dengants -c
.Ada metode lain untuk melakukan ini tetapi untuk kasus penggunaan Anda, mereka semua termasuk Pengumpul Tugas. Saya memilih untuk menggunakan rsync di atas SSH untuk menjaga stempel waktu file, yang tidak akan disalin oleh SMB.
sumber
ts
, tampaknya sangat kuat dan mudah digunakan, hanya bercabang pada github autotoolized dan debianized.task-spooler
:-) ... Lagi pula, yang ada di komentar Anda adalah saran yang sangat bagus, saya akan segera melakukannya.Saya perlu hal-hal seperti ini cukup sering juga. Saya menulis sebuah utilitas kecil yang disebut
after
yang mengeksekusi perintah setiap kali beberapa proses lainnya telah selesai. Ini terlihat seperti ini:Anda kemudian menjalankannya seperti ini:
Keuntungan besar untuk ini dibandingkan beberapa pendekatan lain adalah bahwa pekerjaan pertama tidak perlu dijalankan dengan cara khusus, Anda dapat mengikuti proses apa pun dengan pekerjaan baru Anda.
sumber
Command1 && Command2
sumber
Anda bisa menambahkan perintah ke baris perintah shell yang sudah menjalankan perintah.
Baik mengetik dengan hati-hati, atau mengetiknya di tempat lain, memverifikasi, dan memotong-dan-tempel. Bahkan jika perintah saat ini memuntahkan garis output, Anda masih dapat mengetik sesuatu yang baru, tekan enter, dan itu akan berjalan ketika semua perintah berjalan atau dimasukkan sebelum selesai.
Contoh berikut. Anda dapat memotong dan menempel semuanya, atau memasukkan perintah berikutnya saat yang pertama berjalan (jika Anda mengetik sangat cepat), atau lebih mungkin saat yang kedua berjalan .:
sumber
cara hackiest yang dapat saya pikirkan adalah untuk mempertahankan "status" antrian dengan file-file kunci sederhana di / tmp. ketika file1.sh melakukan perintah cp, itu akan menyimpan file kunci (atau hardlink) di / tmp. setelah selesai, hapus file tersebut. setiap skrip lain harus mencari di / tmp untuk file kunci dengan skema penamaan yang Anda pilih. secara alami ini tunduk pada semua jenis kegagalan, tetapi itu sepele untuk mengatur dan dapat dilakukan sepenuhnya dalam bash.
sumber