2009-09-29 35 views
7

Tôi muốn chạy tập lệnh Perl với một số vòng lặp while (1) trong nền trên máy unix cho đến khi tôi xóa nó.Làm cách nào để tiếp tục chạy chương trình Unix trong nền ngay cả khi tôi đăng xuất?

Đây là một máy tính từ xa mà tôi không có quyền quản trị (vì lý do nào đó, tôi không thể sử dụng Daemon :: Generic :: While1), tôi đăng nhập thông qua SSH và tôi muốn nó tiếp tục chạy sau khi tôi đăng xuất.

Một cách tôi phát hiện ra là viết một cái gì đó như thế này để bash:

nohup ./my_script.pl & 

Có một số người, cách thích hợp hơn để làm điều đó?

Chỉnh sửa crontab bị cấm trên máy tính đó (trong khi chạy nền và các quy trình lâu dài thì không).

Trả lời

17

phương pháp ưa thích của tôi, và cho là dễ dàng nhất, được sử dụng screen:

screen -d -m ./myProcess 
+1

Hah. Tôi đã quên tôi đã bao giờ hỏi câu hỏi này. Màn hình là công cụ của sự lựa chọn của tôi bây giờ, quá :) –

+0

Tôi tìm thấy công cụ cứu sinh này gần đây. 'màn hình' cho phép bạn quay lại lệnh và nhập nội dung. Điều này cũng hoạt động hoàn hảo với SSH. – Kayla

1

Tôi tin rằng điều này sẽ hoạt động từ bên trong tập lệnh perl của bạn.

$SIG{ HUP } = 'IGNORE'; 

Note man page doc cho nohup nói:

Để làm điều này, nohup đặt tín hiệu SIGHUP (3) (` 'terminal dòng gác máy '') để được bỏ qua, sau đó thực thi tiện ích cùng với bất kỳ đối số nào.

0

Chạy công việc ở chế độ nền từ vỏ là tốt, tùy thuộc vào số lao động thủ công bạn muốn đưa vào đảm bảo hoạt động liên tục.

Tôi sẽ sử dụng crontab's @reboot (và có thể là kiểm tra thường xuyên). Nhưng sau đó bạn cần phải xem xét rằng quá trình có thể được bắt đầu nhiều lần. Cách đơn giản nhất để xử lý đó là có tệp khóa. Nếu tệp bị khóa, thoát, hãy tiếp tục công việc. Hãy nhớ sử dụng các kiểm tra không chặn, nếu không bạn sẽ gặp rủi ro khi hogging tài nguyên hệ thống không cần thiết với các tiến trình đã chết. Màn hình

cũng là một tùy chọn nếu có.

màn hình crontab + có thể được kết hợp.

+0

chỉnh sửa crontab bị cấm trên máy tính đó. –

+0

Sau đó, bạn không thể đảm bảo rằng quy trình chạy liên tục (tức là sau khi khởi động lại). màn hình và nohup/bẫy SIGHUP vẫn là cách hợp lệ để đi. – tommym

+0

Lời khuyên, hãy hỏi quản trị viên trước khi đặt bất kỳ quy trình nền nào trên máy đó. Nếu bạn không được phép crontab, quản trị viên có thể không thích bạn đi xung quanh nó. Có lẽ bạn sẽ được phép nếu bạn yêu cầu độc đáo :) – tommym

1

Snippet là trong perldoc perlipc:

use POSIX 'setsid'; 

sub daemonize { 
    chdir '/'    or die "Can't chdir to /: $!"; 
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; 
    open STDOUT, '>/dev/null' 
          or die "Can't write to /dev/null: $!"; 
    defined(my $pid = fork) or die "Can't fork: $!"; 
    exit if $pid; 
    setsid     or die "Can't start a new session: $!"; 
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; 
} 

Nhưng tôi không chắc liệu setsid sẽ làm việc nếu bạn không root. Nếu không, hãy cố gắng gấp đôi ngã ba sau khi đóng các tay cầm tiêu chuẩn.

một số liên kết: howto, daemonize

1
use Proc::Daemon; 
Proc::Daemon::Init; 

Đó là những gì tôi sử dụng cho chương trình lọc Sendmail của tôi và có lẽ là cách dễ nhất để đi. Mô-đun có sẵn qua CPAN.

+0

Nếu anh ta không thể sử dụng Daemon :: Generic :: While1 vì anh ta không thể cài đặt nó, tại sao Proc :: Daemon làm việc tốt hơn? Có phải trong danh sách mô-đun lõi của Perl - nếu không, nó sẽ không giúp được gì nhiều. –

+0

Tôi có thể cài đặt nó (tôi đã sửa đổi CPAN để làm việc mà không có mật khẩu gốc), nhưng nó cho tôi biết điều gì đó về khả năng viết vào/var/run –

+0

Hmm ... Tôi đã xem mã nguồn và mô-đun, chính nó, không cố gắng để ghi vào/var/run (ít nhất là trên phiên bản tôi đang sử dụng). Đó là một mô-đun khá nhỏ, vì vậy bạn có thể chỉ muốn xem qua nó và tạo phiên bản cá nhân hơn với mã tối thiểu bạn yêu cầu. –

6

Bạn cần phải đóng stdout, stderr, stdin, nếu không bạn vẫn đang bị ràng buộc để mà cụ thể TTY

./my_script.pl >/dev/null 2>&1 </dev/null & 

này nên làm các trick.

+0

hoàn hảo! chính xác những gì bạn cần khi không có màn hình – b1r3k

Các vấn đề liên quan