Để đảm bảo một script PHP sẽ tự động khởi động lại nếu bị dừng hoặc bị đóng, bạn có thể sử dụng một số phương pháp để quản lý tiến trình. Phương pháp phổ biến là sử dụng công cụ giám sát như supervisor hoặc viết một bash script để tự động khởi động lại khi cần.

1. Sử dụng Supervisor

Supervisor là một công cụ quản lý tiến trình, cho phép bạn chạy các tiến trình dưới dạng daemon và tự động khởi động lại nếu tiến trình bị dừng.

Cài đặt Supervisor:

Trên hệ điều hành Ubuntu/Debian, bạn có thể cài đặt Supervisor bằng lệnh:

sudo apt-get install supervisor

Cấu hình Supervisor cho script PHP:

Sau khi cài đặt Supervisor, bạn cần tạo file cấu hình cho script PHP của mình. Thông thường, file cấu hình nằm trong thư mục /etc/supervisor/conf.d/.

Ví dụ, tạo một file cấu hình có tên là script.conf:

sudo nano /etc/supervisor/conf.d/script.conf

Thêm nội dung sau vào file:

 

[program:php_script]
command=php /path/to/your/script.php
autostart=true
autorestart=true
stderr_logfile=/var/log/php_script.err.log
stdout_logfile=/var/log/php_script.out.log
  • command: Đường dẫn đến script PHP mà bạn muốn chạy.
  • autostart=true: Tự động khởi động script khi Supervisor khởi động.
  • autorestart=true: Tự động khởi động lại script nếu bị dừng.
  • stderr_logfilestdout_logfile: Đường dẫn đến file log để ghi lại lỗi và đầu ra của script.

Khởi động Supervisor và giám sát script:

Sau khi cấu hình xong, khởi động lại Supervisor để áp dụng thay đổi:

sudo supervisorctl reread
sudo supervisorctl update

Bây giờ, script PHP của bạn sẽ được giám sát và tự động khởi động lại nếu bị dừng.

2. Sử dụng Bash Script và nohup

Nếu bạn không muốn cài đặt công cụ như Supervisor, bạn có thể sử dụng một bash script để kiểm tra và khởi động lại script PHP nếu nó bị dừng.

Ví dụ về Bash Script tự động khởi động lại:

Tạo một file bash script (ví dụ: auto_restart.sh):

#!/bin/bash

while true
do
    # Kiểm tra xem script có đang chạy không
    if ! pgrep -f "php /path/to/your/script.php" > /dev/null
    then
        echo "Script is not running. Starting it..."
        nohup php /path/to/your/script.php > /path/to/your/logfile.log 2>&1 &
    else
        echo "Script is already running."
    fi
    # Kiểm tra lại mỗi 10 giây
    sleep 10
done
  • pgrep -f “php /path/to/your/script.php”: Kiểm tra xem script có đang chạy hay không.
  • nohup php /path/to/your/script.php: Nếu script không chạy, khởi động lại nó bằng nohup.
  • sleep 10: Chờ 10 giây trước khi kiểm tra lại.

Chạy Bash Script:

Để chạy bash script này:

nohup bash auto_restart.sh > /dev/null 2>&1 &

Bash script này sẽ chạy mãi mãi và kiểm tra mỗi 10 giây xem script PHP có đang hoạt động không. Nếu không, nó sẽ tự động khởi động lại.

3. Sử dụng systemd (trên các hệ thống Linux hiện đại)

systemd là hệ thống init trên hầu hết các bản phân phối Linux hiện đại và cho phép bạn tạo các dịch vụ có thể tự động khởi động lại.

Tạo file dịch vụ:

Tạo một file dịch vụ cho script PHP của bạn, ví dụ: /etc/systemd/system/php_script.service.

sudo nano /etc/systemd/system/php_script.service

Thêm nội dung sau:

[Unit]
Description=PHP Script Service
After=network.target

[Service]
ExecStart=/usr/bin/php /path/to/your/script.php
Restart=always
User=www-data
StandardOutput=file:/var/log/php_script.log
StandardError=file:/var/log/php_script.err.log

[Install]
WantedBy=multi-user.target
  • ExecStart: Đường dẫn đến PHP và script của bạn.
  • Restart=always: Tự động khởi động lại nếu script dừng.
  • User=www-data: Chạy script dưới tài khoản www-data (hoặc user bạn muốn).
  • StandardOutputStandardError: Ghi log cho stdout và stderr.

Khởi động dịch vụ:

Sau khi tạo xong file dịch vụ, kích hoạt và khởi động dịch vụ:

sudo systemctl daemon-reload
sudo systemctl enable php_script
sudo systemctl start php_script

Script của bạn sẽ được quản lý bởi systemd và sẽ tự động khởi động lại nếu bị dừng.

Dừng và vô hiệu hóa cùng lúc

Nếu bạn muốn dừng ngay lập tứcvô hiệu hóa tự động khởi động, bạn có thể dùng lệnh sau:

sudo systemctl stop php_script
sudo systemctl disable php_script

Kiểm tra trạng thái dịch vụ

Lệnh này sẽ cho bạn biết liệu dịch vụ có đang chạy, đã bị dừng hay đã được vô hiệu hóa.

sudo systemctl status php_script

Kết luận:

  • Supervisor là một cách dễ dàng và mạnh mẽ để quản lý các tiến trình như script PHP và tự động khởi động lại nếu dừng.
  • Bash script là cách đơn giản và không yêu cầu cài đặt thêm công cụ, nhưng có thể không hiệu quả như các giải pháp khác.
  • systemd là cách chuẩn để quản lý các tiến trình và dịch vụ trên hệ thống Linux hiện đại.

Việc giữ cho một script PHP chạy mãi mãi và tự động khởi động lại khi gặp sự cố là điều quan trọng trong các hệ thống yêu cầu độ tin cậy cao. Bằng cách sử dụng các công cụ như nohup, Supervisor hoặc systemd, bạn có thể dễ dàng quản lý các tiến trình này, đảm bảo chúng luôn hoạt động mà không bị gián đoạn. Tùy thuộc vào nhu cầu và cấu hình hệ thống, mỗi phương pháp đều có ưu điểm riêng, giúp bạn linh hoạt trong việc duy trì hoạt động của các script PHP. Hãy lựa chọn giải pháp phù hợp nhất với hạ tầng của bạn để đảm bảo hiệu suất và tính ổn định lâu dài.