Tự động chờ tiến trình kết thúc trước khi chạy tiến trình mới

🎯 Tổng quát.

Trong quá trình quản trị hệ thống hoặc DevOps, có những tình huống bạn cần đảm bảo một số tiến trình nhất định phải hoàn tất trước khi khởi động một tác vụ khác. Ví dụ: bạn chỉ muốn chạy script backup sau khi các tiến trình “export” kết thúc.

Bài viết này sẽ chia sẻ một shell script đơn giản nhưng hữu ích giúp bạn tự động đợi các tiến trình “export-” hoàn tất, sau đó mới chạy backup.py ở chế độ nền (background).

🎯 Mục tiêu của script

Script thực hiện:

  • Kiểm tra liên tục xem có tiến trình nào tên chứa "export-" đang chạy hay không.
  • Chờ cho đến khi không còn tiến trình như vậy.
  • Khi không còn, chạy backup.py ở chế độ nền (background) trong thư mục /opt/cephbackupttepzc02/source.
  • Kết thúc vòng lặp sau khi backup được khởi chạy.

🧾 Nội dung script

#!/bin/bash

while true; do
    count=$(ps -aef | grep 'export-' | grep -v 'color=auto export' | grep -v grep | wc -l)
    if [ "$count" -eq 0 ]; then
        cd /opt/backup_data/source && nohup python3 backup.py > /dev/null 2>&1 &
        echo "Started backup.py in the background."
        break
    else
        echo "Waiting for export- processes to finish... ($count process(es) running)"
        sleep 10
    fi
done

🧠 Giải thích.

Dòng lệnhGiải thích
while true; doVòng lặp vô hạn, kiểm tra liên tục.
count=...Đếm số tiến trình có chứa "export-" nhưng bỏ qua dòng không liên quan.
if [ "$count" -eq 0 ]; thenNếu không còn tiến trình export- nào đang chạy…
cd ... && nohup python3 backup.py > /dev/null 2>&1 &Chuyển thư mục, chạy backup.py bằng nohup để không bị kill khi terminal đóng và chạy ở chế độ nền.
breakThoát vòng lặp sau khi đã chạy backup.
sleep 10Nếu còn tiến trình export-, chờ 10 giây rồi kiểm tra lại.

📊 Minh họa dòng thời gian hoạt động

Giả sử có 2 tiến trình export-Aexport-B đang chạy:

Thời gian --->

[ export-A đang chạy ]
[ export-B đang chạy ]
[             Script bắt đầu kiểm tra           ]
[             Script thấy còn 2 process         ]
[             Đợi 10s...                       ]
[ export-B kết thúc ] 
[             Script kiểm tra lại thấy 1 process ]
[             Đợi 10s...                       ]
[ export-A kết thúc ]
[             Script kiểm tra thấy 0 process    ]
[     => backup.py được khởi chạy nền 🎉       ]

🧪 Thử nghiệm nhanh

Bước 1: Giả lập tiến trình export

Bạn có thể tạo tiến trình giả để kiểm tra thử:

sleep 1000 &  # Giả lập process tên export-
ps -aef | grep sleep | sed "s/sleep/export-sample/g"

Bước 2: Chạy script

Lưu script vào file wait_and_backup.sh:

chmod +x wait_and_backup.sh
./wait_and_backup.sh

Bạn sẽ thấy dòng log:

Waiting for export- processes to finish... (1 process(es) running)

Và sau khi tiến trình kia kết thúc:

Started backup.py in the background.

✅ Ưu điểm của script

  • Tự động hóa hoàn toàn
  • An toàn: chỉ chạy khi hệ thống đã “rảnh tay”
  • Dễ bảo trì, dễ tích hợp vào các pipeline CI/CD hoặc cronjob

📝 Gợi ý mở rộng

Bạn có thể cải tiến thêm:

  • Ghi log vào file:
    >> /var/log/backup_trigger.log 2>&1
  • Thêm thời gian bắt đầu/kết thúc bằng date
  • Giới hạn số lần kiểm tra (tránh vòng lặp vô hạn)

📌 Tổng kết

Shell script này là một ví dụ đơn giản nhưng thiết thực giúp bạn xử lý các tình huống phụ thuộc tiến trình trong hệ thống Linux. Bằng cách sử dụng các công cụ quen thuộc như ps, grep, while, nohup, bạn có thể xây dựng cơ chế điều phối tiến trình một cách chủ động và tự động.

💬 Nếu bạn thấy bài viết này hữu ích, đừng ngại chia sẻ hoặc để lại bình luận bên dưới nhé!

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email