Apakah mungkin untuk memeriksa progres menjalankan proses cp? Beberapa proses merespons berbagai sinyal KILL sehingga Anda dapat memeriksa statusnya. Saya tahu bahwa saya dapat menjalankan cp dengan parameter -v tetapi bagaimana jika lupa melakukan itu, cp berjalan untuk waktu yang sangat lama dan saya ingin tahu file mana yang sedang disalin, atau berapa banyak yang sudah disalin.
54
while sleep 1 ; do sync ; done
.Jawaban:
Ya, dengan menjalankan stat pada file target dan file lokal, dan mendapatkan ukuran file,
yaitu
stat -c "%s" /bin/ls
Dan Anda mendapatkan persentase data yang disalin dengan membandingkan dua nilai, itu saja
Dalam implementasi yang sangat mendasar akan terlihat seperti ini:
sumber
Pada versi terbaru Mac OS X Anda dapat menekan CTRL+ Tuntuk melihat perkembangannya. Dari halaman manual OSX 10.6 untuk cp (1) :
Memukul CTRL+ Tsama dengan menandakan proses saat ini dengan SIGINFO pada mesin BSD-ish, termasuk OSX.
Ini berfungsi untuk dd (1) juga.
Saya tidak berpikir Linux memiliki mekanisme SIGINFO ini, dan tidak melihat apa pun di halaman manual GNU untuk cp (1) tentang sinyal yang dapat digunakan untuk melaporkan kemajuan.
sumber
mv
masih hidup. Terima kasih!Saat Anda menyalin banyak file,
du -s /path/to/destination
ataufind /path/to/destination | wc -l
memberi Anda gambaran tentang berapa banyak yang telah dilakukan.Anda dapat mengetahui file mana yang sedang disalin di
lsof -p1234
mana 1234 adalah ID prosescp
. Di bawah banyak sistem,pgrep -x cp
melaporkan ID proses dari semua proses yang berjalan yang dinamaicp
. Ini mungkin tidak terlalu berguna karena urutan di mana file di dalam direktori yang diberikan disalin pada dasarnya tidak dapat diprediksi (dalam direktori besar di Linux,ls --sort=none
akan memberitahu Anda; dengan pohon direktori, cobafind
).lsof -p1234
juga memberi tahu Anda berapa banyak byte yangcp
sudah membaca dan menulis untuk file saat ini, diOFFSET
kolom.Di Linux, ada statistik penggunaan IO di
/proc/$pid/io
(sekali lagi, gunakan PIDcp
proses untuk$pidf
). Therchar
nilai adalah jumlah total byte bahwa proses telah membaca, danwchar
adalah jumlah byte bahwa proses telah menulis. Ini tidak hanya mencakup data dalam file tetapi juga metadata dalam direktori. Anda dapat membandingkan angka itu dengan angka perkiraan yang diperolehdu /path/to/source
(yang hanya menghitung data file).read_bytes
danwrite_bytes
hanya menyertakan apa yang telah dibaca atau ditulis dari penyimpanan, yaitu tidak termasuk diagnostik terminal dan data yang sudah ada dalam cache atau masih dalam buffer.sumber
watch lsof -p1234
watch lsof -p`pgrep -x cp`
Alat yang relatif baru yang melakukan persis itu adalah kemajuan (sebelumnya cv [coreutils viewer]).
Apa itu?
Bagaimana cara kerjanya?
sumber
Salah satu trik favorit saya untuk ini (di Linux) adalah untuk mengetahui PID dari
cp
proses (menggunakanps | grep cp
atau serupa), dan kemudian mencari/proc/$PID/fd/
dan/proc/$PID/fdinfo/
.Ini akan menunjukkan kepada Anda file apa yang prosesnya telah buka. Jika Anda ingin melihat seberapa jauh ke dalam file prosesnya adalah ...
yang
pos
parameter adalah posisi membaca (atau menulis) pointer, dalam byte.sumber
Ada beberapa hal yang bisa Anda lakukan. Anda dapat melampirkannya
strace
untuk melihat apa yang dilakukannya (output mungkin berlebihan!):atau Anda bisa
lsof
memberi tahu Anda file mana yang saat ini dibuka:Jika Anda menjalankan rekursif besar
cp
, Anda bisa menggunakanpwdx
untuk mendapatkan direktori kerja saat ini, yang dapat memberi Anda beberapa ide bagaimana melakukannya:sumber
Sementara OP secara khusus menyebutkan kemampuan untuk melihat bagaimana perintah "cp" mengalami kemajuan, harus dikatakan bahwa utilitas lain lebih baik untuk masalah khusus ini.
Sebagai contoh:
akan menunjukkan progres penyalinan file FROM / folder ke file TO / FOLDER.
Dan rsync akan memberi tahu Anda berapa yang disalin (dan kecepatan transfer) di sepanjang jalan. Ini berfungsi untuk file atau folder tunggal baik pada mesin yang sama atau di seluruh jaringan.
sumber
rsync
.Yang dapat Anda lakukan adalah memeriksa file di tempat tujuan.
Jika perintah cp Anda seperti
cp -a <my_source> <my_dest_folder>
saya akan memeriksa file mana yang sudah disalin<my_dest_folder>
dan masing-masing ukuran file, jadi saya bisa melihat perkembangannya. Jika<my_source>
agak rumit (beberapa lapisan direktori) maka skrip kecil akan dapat memeriksa statusnya. Meskipun skrip seperti itu dapat mengkonsumsi sedikit I / O yang kemudian tidak akan digunakan olehcp
proses.sumber
Alat ini adalah perintah utilitas Linux yang mencari perintah dasar coreutils (cp, mv, dd, tar, gzip / gunzip, cat, dll.) Yang saat ini berjalan di sistem Anda dan menampilkan persentase data yang disalin:
https://github.com/Xfennec/cv
sumber
Saya ingin menambahkan
cpv
, bungkus kecil untukpv
itu saya tulis yang meniru penggunaancp
.Sederhana dan bermanfaat
Anda bisa mendapatkannya di sini
sumber
Anda juga dapat menggunakan pipeviewer .
sumber
Gunakan
pv -d
:( sumber )
Cari tahu PID dari menjalankan Anda
cp
(pidof cp
), katakanlah itu adalah 12345; maka sederhananyaCatatan:
pv
sebagai pengguna yang sama yang menjalankancp
(atau sebagai root).cp
sedang memproses file kecil saat ini, Anda mungkin tidak akan melihat semuanya dalam output (file kecil mungkin ditutup terlalu cepat untukpv
diambil). Namun beberapa akan muncul, sehingga Anda pun dapat mengetahui apa yangcp
terjadi.pv -d "$(pidof cp)"
dapat bekerja; tetapi jika ada lebih dari satucp
berlari, itu tidak akan berhasil. Adapidof -s
yang mengembalikan paling banyak satu PID, tetapi Anda tidak bisa memastikan itu akan menjadi bagian daricp
proses yang benar jika ada banyak.sumber
Anda dapat mengirim sinyal ke proses:
Bahkan lebih berguna untuk membuat skrip yang melakukan polling sampai Anda menekan Ctrl-C atau proses selesai:
Bekerja untuk dd. Tidak berfungsi untuk cp . Mungkin Anda harus menggunakan sinyal lain. Saya pernah mencoba SIGINFO, tetapi sepertinya tidak ada lagi di platform Intel.
sumber