Sử dụng nohup để giữ cho tập lệnh chạy vô thời hạn


7

Tôi rất mới Linuxvà tôi chỉ sử dụng nó cho SSHmáy chủ web của mình bằng cách sử dụng Putty. Vấn đề tôi đang gặp phải là đây:

Về cơ bản tôi đã có 2 phptập lệnh. Một người get_tweets.phpliên tục lắng nghe các tweet trên twitters Streaming APItrong khi người kia - parse_tweets.phpđăng chúng thành một db. Để những thứ này hoạt động, chúng phải được chạy liên tục.

Tôi đã sử dụng các lệnh sau để chạy chúng trong nền và từ những gì tôi thấy chúng chạy hầu hết thời gian trong ngày, tuy nhiên bất cứ khi nào tôi đăng nhập vào máy tính của mình vào buổi sáng thì nó scriptsđã dừng và tôi chạy các lệnh lần nữa.

nohup php my_script.php > /dev/null &

Tôi chỉ tự hỏi nếu điều đó là bình thường dựa trên các lệnh tôi đang sử dụng, chúng có nên chạy vô thời hạn khi sử dụng nohupvà nếu không thì cái gì thay thế? Một CRONcông việc?

Cảm ơn đã giúp đỡ

Câu trả lời:


9

Với nohupbạn cũng phải chuyển hướng cũng có lỗi. Lệnh tiếp theo chạy tập lệnh với đầu ra và lỗi chuyển hướng đến / dev / null:

nohup php my_script.php >/dev/null 2>&1 &

Nhưng tập lệnh của bạn có thể bị chấm dứt bởi một số lý do khác (lỗi trong tập lệnh, oom-killer, v.v.). Vì vậy, bạn nên trình bày nó bằng init của hệ thống (nếu nó hỗ trợ tự động khởi động lại - khởi động, systemd và một số người khác có thể làm điều đó). Hoặc bạn nên viết tác vụ cron để kiểm tra và khởi động lại tập lệnh của mình nếu nó không chạy.


4

Có lẽ bạn muốn xem những gì đang xảy ra và không chuyển hướng đầu ra /dev/null.

Tôi đề nghị bạn mở một screenhoặc tmuxphiên. Cả hai đều là bộ ghép kênh đầu cuối , chúng sẽ tồn tại ngay cả khi bạn đăng xuất.

Ví dụ (..)để biết thông tin

$ screen
$(inside screen-t1): ./get_tweets.php
.... running first

Bây giờ nhấn Ctrl-a cđể mở một thiết bị đầu cuối mới.

 $(inside screen-t2): ./parse_tweets.php
 ... running second

Ctrl-a dcho phép bạn tách phiên. Khi bạn đăng nhập lại, sử dụngscreen -r

Lưu ý: Bạn có thể hiển thị một thanh trạng thái trong màn hình để trực quan hóa các cửa sổ khác nhau.


0

Nếu bạn chỉ muốn đảm bảo rằng tập lệnh của bạn khởi động lại khi nó chết, bạn có thể làm một cái gì đó như while true ; do php my_script.php ; done > /dev/null

Điều này sẽ đợi my_script.php chạy xong, rồi chạy lại. Tất cả đầu ra sẽ được gửi đến / dev / null

Nếu bạn muốn sử dụng nohup, thì bạn nên làm như sau

$ echo 'while true ; do php my_script.php ; done > /dev/null' > ~/php_run_loop.sh
$ chmod a+x ~/php_run_loop.sh
$ nohup ~/php_run_loop.sh

LƯU Ý: Nếu bạn gặp lỗi hoặc sự cố khác trong tập lệnh php của mình, điều này sẽ khiến nó chạy đi chạy lại không giới hạn. Đây không phải là một giải pháp duyên dáng, nhưng nó là một giải pháp.

BTW, cron rất tốt để chạy một quy trình ngắn trong lịch trình (cứ sau 5 phút hoặc mỗi tuần, v.v.), nó không biết làm thế nào để duy trì một quy trình hiện có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.