มีวิธีหยุดกระบวนการทำงานชั่วคราวบนระบบ Linux และกลับมาทำงานต่อในภายหลังหรือไม่?


37

ฉันต้องคัดลอกไฟล์บนเครื่อง และข้อมูลมีขนาดใหญ่มาก ตอนนี้เซิร์ฟเวอร์จำเป็นต้องให้บริการตามปกติและโดยปกติจะมีช่วงเวลาที่ยุ่งเหยิงในช่วงนั้น ดังนั้นมีวิธีการเรียกใช้คำสั่งดังกล่าวในลักษณะที่ว่าถ้าเซิร์ฟเวอร์ไม่ว่างชั่วโมงมันหยุดกระบวนการและเมื่อออกจากช่วงที่มันจะดำเนินการต่อหรือไม่

ตั้งใจ-ผล

cp src dst

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

22
rsync สามารถทำการถ่ายโอนต่อได้บางส่วน
Thorbjørn Ravn Andersen

2
คุณต้องการข้อมูลจริงที่จะคัดลอกเป็นการสำรองหรือไม่? ถ้าไม่คุณสามารถใช้cp -alทำฟาร์มฮาร์ดลิงก์ได้หรือไม่? หรือใช้ระบบไฟล์ที่รองรับ reflink ระดับบล็อกด้วย copy-on-write โดยใช้cp -a --reflink=auto? BTRFS และ ZFS รองรับการทำสำเนาภายในอุปกรณ์ฟิสิคัลเดียวกัน
Peter Cordes

9
ไฟล์ใด ๆ มีการsrcเปลี่ยนแปลงระหว่างเวลา 9:00 น. - 14:00 น. หรือไม่? หากเป็นเช่นนั้นเพียงหยุดและกลับสู่cpกระบวนการต่อไปอาจทำให้ไฟล์เสียหาย มันอาจจะดีกว่าที่จะทำงานrsyncร่วมกับtimeoutคำสั่ง
Mark Plotnick

ไฟล์ถูกคัดลอกมาจากไหนและไปที่ไหน? นี่เป็นระบบเสมือนจริงหรือไม่? ระบบไฟล์ต้นทางคืออะไร วัตถุประสงค์ของการคัดลอกคืออะไร?
Braiam

@Braiam Im ใช้ rsync และคัดลอกไฟล์จากระยะไกลไปยังเครื่องท้องถิ่น ฉันเพิ่งใช้คำสั่ง cp เป็นตัวอย่างที่นี่ btw
Sollosa

คำตอบ:


7

ใช่คุณต้อง

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

กระบวนการจะปรากฏขึ้นพร้อมกับสถานะ "T" (PS) เพื่อดำเนินการต่อ

$> kill -CONT <pid>

โชคดี!


77

คุณสามารถหยุดการประมวลผลได้ชั่วคราวโดยส่งสัญญาณ SIGSTOP แล้วกลับมาทำงานต่อในภายหลังโดยส่ง SIGCONT

สมมติว่าภาระงานของคุณเป็นกระบวนการเดียว (ไม่แยกผู้ช่วยเหลือที่ทำงานในพื้นหลัง) คุณสามารถใช้สิ่งนี้:

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

จากนั้นเมื่อเวลาว่างเริ่มต้นให้ส่ง SIGSTOP:

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

ในภายหลังเมื่อเซิร์ฟเวอร์ไม่ได้ใช้งานอีกครั้งให้ดำเนินการต่อ

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

คุณจะต้องกำหนดเวลานี้เฉพาะเวลาที่คุณต้องการให้เรียกใช้งานคุณสามารถใช้เครื่องมือเช่น cron หรือ systemd timers (หรือเครื่องมืออื่น ๆ ที่คล้ายคลึงกัน) เพื่อให้ได้รับตารางนี้ แทนที่จะกำหนดเวลาตามช่วงเวลาคุณอาจเลือกที่จะตรวจสอบเซิร์ฟเวอร์ (อาจดูที่ค่าเฉลี่ยการโหลดการใช้งาน cpu หรือกิจกรรมจากบันทึกเซิร์ฟเวอร์) เพื่อตัดสินใจว่าจะหยุดชั่วคราว / กลับสู่การคัดลอกเมื่อใด

คุณต้องจัดการไฟล์ PID (ถ้าคุณใช้) ตรวจสอบให้แน่ใจว่าสำเนาของคุณยังคงทำงานอยู่ก่อนที่จะหยุดมันอาจเป็นไปได้ว่าคุณต้องการล้างข้อมูลด้วยการลบ pidfile เมื่อคัดลอกเสร็จ ฯลฯ

กล่าวอีกนัยหนึ่งคุณต้องการสิ่งนี้เพื่อสร้างความน่าเชื่อถือ แต่แนวคิดพื้นฐานของการใช้สัญญาณ SIGSTOP และ SIGCONT เหล่านี้เพื่อดำเนินการหยุดชั่วคราว / ดำเนินการต่อของกระบวนการดูเหมือนจะเป็นสิ่งที่คุณกำลังมองหา



1
อาจเพิ่มการเตือนความจำว่าคุณควรระวังอย่างมากว่า '/var/run/bigcopy.pid' ยังคงอ้างถึงกระบวนการเดียวกับที่คุณคิด การหยุดกระบวนการอื่นแบบสุ่มในระบบอาจไม่เป็นที่ต้องการ ฉันรู้ว่าไม่มีวิธีที่ปลอดภัยเพื่อให้แน่ใจว่า pid อ้างถึงโปรแกรมที่คุณคิดว่ามันเป็น ...
Evan Benn

@EvanBenn ใช่นั่นคือสิ่งที่ฉันหมายถึงในทางที่ "ตรวจสอบให้แน่ใจว่าสำเนาของคุณยังคงทำงานก่อนที่จะหยุดมัน" แม้ว่าจุดของคุณชัดเจนกว่านั้นจริงๆ! ใช่การตรวจสอบ PID นั้นโดยธรรมชาติแล้วก็คือ y ดังนั้นบางครั้งมันเป็นไปไม่ได้เลยที่จะทำ 100% อย่างน่าเชื่อถือ ...
filbranden

@cat ไม่ได้จริงๆกระบวนการไม่สามารถบล็อก SIGSTOP ได้ เห็นลิงก์จากความคิดเห็นแรก: "SIGSTOP เป็นสัญญาณที่ไม่สามารถปิดกั้นได้เช่น SIGKILL" (หรือเพียงแค่ google คุณจะเห็นว่าเป็นกรณี)
filbranden

76

แทนที่จะระงับกระบวนการคุณสามารถให้ความสำคัญต่ำกว่า:

renice 19 "$pid"

จะให้ความสำคัญต่ำที่สุด (ความดีที่สุด) ดังนั้นกระบวนการนั้นจะให้ CPU กับกระบวนการอื่น ๆ ที่ต้องใช้เวลาส่วนใหญ่

บน Linux สามารถทำได้ด้วย I / O ด้วยionice:

ionice -c idle -p "$pid"

จะทำให้กระบวนการในชั้น "ไม่ได้ใช้งาน" ดังนั้นมันจึงจะได้รับเวลาดิสก์เมื่อไม่มีโปรแกรมอื่นได้ขอให้ดิสก์ของ I / O สำหรับระยะเวลาผ่อนผันที่กำหนดไว้


22
นี้เป็นกรณีทั่วไปของปัญหา XY คำถามคือวิธีการหยุดกระบวนการชั่วคราว แต่ไม่ตอบคำถาม แม้ว่าการลดระดับความสำคัญเป็นวิธีการที่ดีกว่าสำหรับปัญหาจริงแต่ก็ไม่ได้ตอบคำถาม ฉันจะแก้ไขคำถามเพื่อให้รวมถึงวิธีการหยุดกระบวนการชั่วคราวและทำไมการหยุดชั่วคราวอาจเป็นปัญหา (เช่นไฟล์สามารถแก้ไขได้ในขณะที่หยุดชั่วคราว)
MechMK1

22
@DavidStockinger ในทางเทคนิคแล้วคำตอบนี้บอกวิธีที่จะบอกให้ OS หยุดกระบวนการชั่วคราวเมื่อ (ตัวกำหนดเวลา OS, CPU, I / O) ไม่ว่าง (แม้ว่าจะเป็นเสี้ยววินาทีในแต่ละครั้ง) วิธีการระงับกระบวนการด้วยตนเองได้รับการครอบคลุมในคำตอบอื่น ๆ แล้ว วิธีการแก้ปัญหานี้ไม่ได้แก้ไขปัญหาของไฟล์ที่ถูกแก้ไขในขณะที่พวกเขากำลังคัดลอก
Stéphane Chazelas

5
การเปลี่ยนลำดับความสำคัญของ I / O ไม่ใช่วิธีที่ดีที่สุดเสมอไป หากคุณกำลังคัดลอกจากดิสก์หมุนคุณอาจยังคงต้องหาก่อนที่จะขอความสำคัญสูงซึ่งคุณจะไม่เกิดขึ้นถ้าคุณหยุดการดำเนินการลำดับความสำคัญต่ำทั้งหมด
ทำเครื่องหมาย

2
ลำดับความสำคัญต่ำกว่าไม่ได้แก้ปัญหา แม้ว่ากล่องจะไม่ได้ใช้งานอย่างสมบูรณ์เป็นเวลาสองสามวินาทีหรือไม่กี่นาทีก็ตามนั่นไม่ได้หมายความว่ากระบวนการคัดลอกขนาดใหญ่ที่จะขับไล่ทุกสิ่งจากแคชของระบบไฟล์จะไม่เป็นการรบกวน ทันทีที่มีการโหลดอีกครั้งมันจะเป็นเพจจิ้งช้ามากทุกอย่างกลับมา

2
@DavidStockinger วิธีที่เหมาะสมในการจัดการกับปัญหา XY คือการให้ทางออกที่ถูกต้องแม้ว่าจะไม่ใช่คำถามที่ถามก็ตาม เมื่อคุณรู้ว่าวิธีการที่อธิบายในคำถามนั้นผิดคำตอบที่ดีนั้นไม่ได้ให้แนวทางที่ผิด แต่ให้เสนอวิธีที่ดีกว่าแทน
terdon

8

ใช้ rsync ลืมเกี่ยวกับ cp สำหรับสถานการณ์นี้ มี params ในการ จำกัด แบนด์วิดท์ด้วยหรือสามารถฆ่า / หยุดและเริ่มในภายหลังในแบบที่มันจะดำเนินต่อไปโดยที่มันเหลือ google rsync example / s


3

หากคุณกำลังจะทำโดยการขัดจังหวะกระบวนการทำงานฉันขอแนะนำให้เล่นกับโปรแกรมหน้าจอ ฉันไม่ได้ใช้ลีนุกซ์มาก่อน แต่ IIRC ก็หยุดคำสั่งไว้ชั่วคราวและกลับมาทำงานต่อในภายหลังทำให้คุณค่อนข้างอ่อนไหวถ้าคุณออกจากระบบโดยไม่ได้ตั้งใจคุณจะไม่สามารถกลับมาทำงานต่อได้

ด้วยหน้าจอฉันเชื่อว่าคุณสามารถขัดจังหวะเซสชั่นแล้วถอดมันและออกจากระบบ หลังจากนั้นคุณสามารถย้อนกลับไปที่เซสชันนั้นอีกครั้ง คุณต้องเล่นกับมันสักหน่อย แต่มันทำให้เซสชันแข็งแกร่งขึ้นมาก

นอกจากนี้คุณยังสามารถออกจากระบบและกลับบ้านจากนั้นเข้าสู่ระบบจากระยะไกลกลับไปที่ระบบที่คุณเริ่มต้นในสำนักงานและกลับมาทำงานอีกครั้งในช่วงเย็นแล้วรับมันอีกครั้งในวันถัดไปที่ทำงาน


ฉันใช้ tmux สำหรับ tha อยู่แล้ว แต่ฉันกำลังเขียนสคริปต์ที่จะรู้ตัวหรือรู้ตัวดีกว่าว่ามันจะหยุดถ้าเซิร์ฟเวอร์ได้รับ traf สูงและดำเนินการต่อเมื่อเป็นเรื่องปกติ
Sollosa

0

หากเชลล์ของคุณรองรับ (เกือบทั้งหมดทำได้) คุณสามารถกด ^ Z (Ctrl + Z) เพื่อส่งSIGTSTPสัญญาณไปยังงานเบื้องหน้าได้อย่างง่ายดายจากนั้นดำเนินการต่อด้วยfg(บนส่วนหน้า) หรือbg(บนพื้นหลัง)

หากคุณทำสิ่งนี้หลายภารกิจและต้องการกลับมาทำงานใหม่ในภายหลังคุณสามารถใช้jobsคำสั่งจากนั้นส่งคืนด้วยfg/bg %#โดยที่ # คือหมายเลขที่ระบุในวงเล็บปีกกาในงาน

โปรดจำไว้ว่าSIGTSTPแตกต่างจากSIGSTOP(ซึ่งใช้กับคำตอบอื่น ๆ ทั้งหมด) ที่สำคัญที่สุดเนื่องจากความจริงที่ว่ามันสามารถถูกเพิกเฉยได้ (แต่ฉันไม่เห็นโปรแกรมที่ไม่สนใจเลยsl) รายละเอียดเพิ่มเติมสามารถพบได้ในคำตอบนี้ใน StackOverflow


แปลกใจที่ยังไม่มีคำตอบที่กล่าวถึงนี้
Ave

Ty Ave ฉันรู้เคล็ดลับการทำงานหลายอย่างนี้ แต่เพื่อที่จะเกิดขึ้นเราจำเป็นต้องอยู่ในเทอร์มินัลในขณะที่ฉันต้องสร้างสคริปต์ที่จะทำงานด้วยตัวเองไม่ว่าจะใช้เวลากี่วันก็ตาม
Sollosa

@Sollosa มันจะเป็นประโยชน์กับคนอื่น ๆ ด้วยคำถามเดียวกันและมีการเข้าถึงสถานี
Ave

ฉันเห็นด้วย. ยินดีที่ได้รู้จักคุณ Ave :)
Sollosa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.