2011-02-08 34 views
5

Tôi đang cố gắng để chạy daemon đơn giản này bằng cliSystem_Daemon thất bại trong việc mở dòng /var/log/mydaemonname.log

function doTask(){ 

    echo 'mytest'; 
} 
// Include PEAR's Daemon Class 
require_once "/usr/share/php/System/Daemon.php"; 

// Bare minimum setup 
System_Daemon::setOption("appName", "mydaemonname2"); 

try{ 
// Spawn Deamon! 
System_Daemon::start(); 

// Your PHP Here! 
while (true) { 
    doTask(); 
} 

// Stop daemon! 
System_Daemon::stop(); 
} 
catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 



notice: Starting mydaemonname daemon, output in: '/var/log/mydaemonname.log' 
[Feb 08 12:17:23] warning: [PHP Error] file_put_contents(/var/log/mydaemonname.log): failed to open stream: Permission denied 

cả host nội bộ và trong máy chủ dev của tôi.

Nếu tôi cố gắng xấp xỉ tạo và thiết lập 777 cho phép tập tin để /var/log/mydaemonname.log tôi nhận được lỗi này khác

[Feb 08 12:30:31] notice: Starting mydaemonname daemon, output in: '/var/log/mydaemonname.log' 
[Feb 08 12:30:31]  err: Unable to create directory: '/var/run/mydaemonname' [l:1366] 
[Feb 08 12:30:31] emerg: Unable to write pid file /var/run/mydaemonname/mydaemonname.pid [l:1272] 
[Feb 08 12:30:31]  info: Process was not daemonized yet, just halting current process 

và chmod nếu tôi cố gắng thiết lập 777 cho phép tập tin vào thư mục/var/run/mydaemonname Tôi nhận được thông tin này trong tệp nhật ký

notice: Starting mydaemonname daemon, output in: '/var/log/mydaemonname.log' 
[Feb 08 12:17:06]  err: Unable to change group of file '/var/run/mydaemonname/mydaemonname.pid' to 0 [l:1425] 
[Feb 08 12:17:06]  crit: Unable to change identity [l:1281] 
[Feb 08 12:17:06] emerg: Cannot continue after this [l:1283] 

Bạn có thể giúp tôi không?

Tạm biệt

+0

Bạn có thể muốn đặt tùy chọn appRunAsUID, appRunAsGID, appPidLocation và logLocation. – rik

+0

Tôi đã thử với $ path = dirname (__ FILE__); System_Daemon :: setOption ("appName", "mydaemonnew"); System_Daemon :: setOption ("appRunAsUID", 0); System_Daemon :: setOption ("appRunAsGID", 0); System_Daemon :: setOption ("appPidLocation", $ path. '/ Mypid'); System_Daemon :: setOption ("logLocation", $ path. '/ Mylog'); – Whisher

+0

nhưng tôi nhận được [Feb 08 18:36:07] thông báo: Bắt đầu mydaemonnew daemon, xuất trong: '/ home/whisher/public_html/speakage/mailbomber/tests/gearman/mylog' [Feb 08 18:36:07] err: Kể từ phiên bản 0.6.3, pidfile cần phải nằm trong thư mục con riêng của nó như:% s/mydaemonnew/mydaemonnew.pid [l: 1339] [Feb 08 18:36:07] xuất hiện: Không thể ghi tệp pid/Trang chủ/whisher/public_html/speakage/mailbomber/kiểm tra/gearman/mypid [l: 1272] [Feb 08 18:36:07] info: Quá trình không được daemonized được nêu ra, chỉ cần tạm dừng quá trình hiện tại Tôi cần thêm manh mối :) – Whisher

Trả lời

4

Bạn sử dụng daemon làm người dùng nào? nếu nó không phải root thì đây có thể là câu trả lời:

Tùy chọn "appRunAsUID" và "appRunAsGID" đặt người dùng bắt đầu daemon nên chuyển sang sử dụng trong quá trình con (daemonized). Nó cần phải bắt đầu như người dùng "root" để có thể có quyền truy cập chính xác vào pidfile. Vì vậy, bạn nên đặt "appRunAsUID" và "appRunAsGID" thành người dùng không có đặc quyền mà tập lệnh được daemonized sẽ chạy như, nhưng bạn cần bắt đầu quá trình là "root" để có thể ghi pid và chuyển người dùng.

+0

Cảm ơn rất nhiều nó hoạt động :) – Whisher

+0

Cố gắng tìm kiếm tài liệu cho các thông tin như thế này vô ích.Cảm ơn. – webkraller

0

Tin nhắn cho rằng đó là vấn đề về quyền, thiết lập "appRunAsUID" và "appRunAsGID" = 0 (GID và UID của người dùng root) bạn giải quyết vấn đề.

Một vấn đề khác liên quan đến loại vấn đề này là. Kể từ phiên bản 0.6.3, pidfile cần nằm trong thư mục con của chính nó. Khi có nghĩa là daemon chạy đầu tiên trong appPidLocation mặc định đó là:

/var/run/< AppName>/< daemon_name> .pid

Và daemon thứ hai mà có thể bạn sẽ chạy phải cùng tồn tại trong cùng một thư mục. Khi bạn có thể xác định động

 $path_pid = '/var/run/'.System_Daemon::getOption('appName'); 
     System_Daemon::setOption("appPidLocation",$path_pid.'/'.$pidFile); 
Các vấn đề liên quan