Apakah ada cara untuk menghentikan sementara proses yang berjalan pada sistem Linux dan melanjutkannya nanti?


37

Saya harus menyalin file di mesin. Dan datanya sangat besar. Sekarang server perlu melayani secara normal, dan biasanya ada rentang jam sibuk tertentu pada mereka. Jadi, apakah ada cara untuk menjalankan perintah sedemikian rupa sehingga jika server mencapai jam sibuk, ia berhenti proses, dan ketika keluar dari kisaran itu, ia melanjutkannya?

Hasil yang Dimaksudkan

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsync dapat melanjutkan transfer sebagian
Thorbjørn Ravn Andersen

2
Apakah Anda memerlukan data aktual untuk disalin sebagai cadangan? Jika tidak, dapatkah Anda menggunakan cp -aluntuk membuat kebun hardlink? Atau gunakan sistem file yang mendukung reflink level blok dengan copy-on-write, gunakan cp -a --reflink=auto? BTRFS dan ZFS mendukungnya untuk salinan dalam perangkat fisik yang sama.
Peter Cordes

9
Apakah ada file yang srcdiubah antara pukul 9: 00-14: 00? Jika demikian, cukup menjeda dan melanjutkan cpproses dapat mengakibatkan file rusak. Mungkin lebih baik dijalankan rsyncdalam kombinasi dengan timeoutperintah.
Mark Plotnick

Dari dan ke tempat file disalin? Apakah ini sistem virtual? Apa itu sistem file sumber? Apa tujuan dari salinan itu?
Braiam

@Braiam Im menggunakan rsync, dan menyalin file dari jarak jauh ke mesin lokal. Saya hanya menggunakan perintah cp sebagai contoh di sini btw
Sollosa

Jawaban:


7

Ya, Anda Perlu

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

Proses kemudian akan Muncul dengan Status "T" (PS). Untuk melanjutkan, lakukan a

$> kill -CONT <pid>

Semoga berhasil!


77

Anda dapat menghentikan sementara proses dengan mengirimkannya sinyal SIGSTOP dan kemudian melanjutkannya dengan mengirimkannya SIGCONT.

Dengan asumsi beban kerja Anda adalah proses tunggal (tidak garpu pembantu berjalan di latar belakang), Anda dapat menggunakan sesuatu seperti ini:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

Kemudian ketika waktu sibuk dimulai, kirimkan sebuah SIGSTOP:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

Kemudian, ketika server menganggur lagi, lanjutkan.

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

Anda perlu menjadwalkan ini untuk waktu tertentu ketika Anda ingin dieksekusi, Anda dapat menggunakan alat seperti timer cron atau systemd (atau berbagai alat serupa lainnya) untuk mendapatkan jadwal ini. Alih-alih menjadwalkan berdasarkan interval waktu, Anda dapat memilih untuk memantau server (mungkin melihat rata-rata beban, penggunaan cpu atau aktivitas dari log server) untuk membuat keputusan kapan harus menjeda / melanjutkan salinan.

Anda juga perlu mengelola file PID (jika Anda menggunakannya), pastikan salinan Anda benar-benar masih berjalan sebelum menjeda, mungkin Anda ingin membersihkan dengan menghapus pidfile setelah salinan selesai, dll.

Dengan kata lain, Anda perlu lebih banyak di sekitar ini untuk membuat yang dapat diandalkan, tetapi ide dasar untuk menggunakan sinyal SIGSTOP dan SIGCONT ini untuk menjeda / melanjutkan pelaksanaan suatu proses tampaknya menjadi yang Anda cari.



1
Mungkin tambahkan pengingat bahwa Anda harus sangat berhati-hati bahwa '/var/run/bigcopy.pid' masih mengacu pada proses yang sama seperti yang Anda pikirkan. menghentikan proses lain pada sistem secara acak mungkin tidak diinginkan. Saya tahu tidak ada cara yang aman untuk memastikan bahwa pid mengacu pada program yang Anda pikir tidak ...
Evan Benn

@ EvanBenn Ya itu yang saya maksud dengan cara "pastikan salinan Anda benar-benar masih berjalan sebelum menjeda" meskipun poin Anda jelas lebih eksplisit dari itu! Ya memeriksa PID secara inheren ras-y sehingga kadang-kadang tidak mungkin untuk melakukannya 100% andal ...
filbranden

@cat Tidak juga, suatu proses tidak dapat memblokir SIGSTOP. Lihat tautan dari komentar pertama: "SIGSTOP adalah sinyal yang tidak dapat diblokir seperti SIGKILL" (atau hanya google saja, Anda akan melihat masalahnya)
filbranden

76

Alih-alih menunda proses, Anda juga bisa memberikan prioritas yang lebih rendah:

renice 19 "$pid"

akan memberikan prioritas terendah (tingkat kebaikan tertinggi), sehingga proses akan menghasilkan CPU untuk proses lain yang paling membutuhkannya.

Di Linux, hal yang sama dapat dilakukan dengan I / O dengan ionice:

ionice -c idle -p "$pid"

Akan menempatkan proses di kelas "idle", sehingga hanya akan mendapatkan waktu disk ketika tidak ada program lain yang meminta disk I / O untuk masa tenggang yang ditentukan .


22
Ini adalah kasus khas dari masalah XY . Pertanyaannya adalah bagaimana cara menghentikan suatu proses, tetapi ini tidak menjawab pertanyaan. Meskipun menurunkan prioritas adalah pendekatan yang lebih baik untuk masalah yang sebenarnya , itu tidak menjawab pertanyaan. Saya akan mengedit pertanyaan untuk juga menyertakan cara menjeda proses dan mengapa menjeda mungkin menjadi masalah (misalnya file dapat diedit saat dijeda).
MechMK1

22
@ Davidvidockock, secara teknis, jawaban ini memberitahu cara memberitahu OS untuk menjeda proses ketika (OS, CPU, I / O scheduler) sedang sibuk (bahkan jika itu untuk pecahan detik pada suatu waktu). Cara menangguhkan proses secara manual sudah tercakup dalam jawaban lain. Solusi ini tidak mengatasi masalah file yang sedang dimodifikasi saat sedang disalin.
Stéphane Chazelas

5
Mengubah prioritas I / O tidak selalu merupakan solusi terbaik. Jika Anda menyalin dari disk pemintalan, Anda mungkin masih harus mencari sebelum setiap permintaan prioritas tinggi yang Anda tidak akan dikenakan jika Anda benar-benar menghentikan operasi prioritas rendah.
Tandai

2
Prioritas yang lebih rendah bahkan tidak menyelesaikan masalah. Bahkan jika kotak itu benar-benar diam selama beberapa detik atau menit, itu tidak berarti bahwa proses penyalinan besar yang akan mengusir semuanya dari cache sistem file akan tidak mengganggu. Begitu ada beban lagi, semuanya akan kembali dengan lambat.
R ..

2
@ Davidvidockock cara yang disukai untuk menangani masalah XY adalah dengan memberikan solusi yang tepat , bahkan jika bukan itu yang ditanyakan. Ketika Anda tahu pendekatan yang dijelaskan dalam pertanyaan itu salah, maka jawaban yang baik tidak memberikan pendekatan yang salah tetapi malah mengusulkan yang lebih baik.
terdon

8

Gunakan rsync, lupakan cp, untuk skenario ini. ada params untuk membatasi bandwidth, atau dapat dibunuh / dihentikan dan mulai nanti, dengan cara itu akan berlanjut, di mana ia meninggalkan google rsync example / s


3

Jika Anda akan melakukannya dengan mengganggu proses yang sedang berjalan, saya sarankan bermain dengan program Screen. Saya belum pernah menggunakan Linux untuk sementara waktu, tetapi IIRC hanya menjeda perintah dan melanjutkannya lagi membuat Anda sangat rentan, jika Anda tidak sengaja keluar, Anda tidak akan dapat melanjutkan kembali sesi Anda.

Dengan layar saya percaya Anda dapat mengganggu sesi kemudian lepaskan dan keluar. Nanti Anda dapat kembali dan menyambung kembali ke sesi itu. Anda harus bermain dengannya sedikit tetapi itu membuat sesi jauh lebih kuat.

Anda juga dapat logout dan pulang, kemudian login dari jarak jauh, pasang kembali ke sistem y Anda mulai di kantor dan melanjutkan untuk malam itu, kemudian mengambilnya lagi pada hari berikutnya di tempat kerja.


Saya sudah menggunakan tmux untuk tha. Tapi saya sedang menulis skrip yang akan sadar diri atau lebih baik sadar lingkungan, jadi berhenti jika server mendapat lalu lintas tinggi, dan melanjutkan ketika itu normal.
Sollosa

0

Jika shell Anda mendukungnya (hampir semuanya), Anda dapat menekan ^ Z (Ctrl + Z) untuk dengan mudah mengirim SIGTSTPsinyal ke tugas latar depan, kemudian lanjutkan dengan fg(di latar depan) atau bg(di latar belakang).

Jika Anda melakukan ini pada banyak tugas dan ingin kembali lagi nanti, Anda dapat menggunakan jobsperintah, lalu kembali dengan fg/bg %#, di mana # adalah angka yang diberikan dalam tanda kurung pada pekerjaan.

Perlu diingat bahwa SIGTSTPini sedikit berbeda dari SIGSTOP(yang digunakan pada semua jawaban lain), yang paling penting karena fakta bahwa itu dapat diabaikan (tapi saya tidak melihat program mengabaikannya selain sl). Rincian lebih lanjut dapat ditemukan pada jawaban ini di StackOverflow .


Terkejut bahwa tidak ada jawaban yang menyebutkan ini.
Ave

Ty Ave, saya tahu trik multitasking ini. Tetapi agar itu terjadi, seseorang harus berada di terminal, sedangkan saya harus membuat sebuah skrip yang akan melakukan pekerjaan sendiri, tidak masalah jika itu membutuhkan waktu berhari-hari.
Sollosa

@Sollosa dapat bermanfaat bagi orang lain dengan pertanyaan yang sama, dan dengan akses ke terminal.
Ave

Saya setuju. Senang mengetahui Anda Ave :)
Sollosa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.