2011-12-29 14 views
5

Tôi đã viết một kịch bản Upstart cho Redis như sau:Chạy Redis ở dạng daemonized và sử dụng Upstart để quản lý nó không hoạt động

description "Redis Server" 

start on runlevel [2345] 
stop on shutdown 
expect daemon 

exec sudo -u redis /usr/local/bin/redis-server /etc/redis/redis.conf 

respawn 
respawn limit 10 5 

tôi sau đó cấu hình redis qua nó redis.conf tới:

daemonize yes 

Tất cả tài liệu và thử nghiệm của riêng tôi cho biết Redis forks hai lần ở dạng được sao chép và "daemon dự kiến" sẽ hoạt động, nhưng tập lệnh Upstart luôn giữ trên PID của cha mẹ cũ (PID - 1). Có ai làm việc này không?

Trả lời

3

Những người khác có cùng vấn đề. Xem this gist.

Khi tùy chọn daemonize được kích hoạt, Redis không kiểm tra xem quá trình đã là daemon chưa (không có lệnh gọi getppid). Nó có hệ thống dĩa, nhưng chỉ một lần. Nó là hơi khác thường, các cơ chế daemonization khác có thể yêu cầu kiểm tra ban đầu trên getppid, và fork được gọi hai lần (trước và sau cuộc gọi setid), nhưng trên Linux thì điều này là không bắt buộc.

Xem this faq để biết thêm thông tin về cách sao chép daemon.

Redis daemonize chức năng là cực kỳ đơn giản:

void daemonize(void) { 
    int fd; 

    if (fork() != 0) exit(0); /* parent exits */ 
    setsid(); /* create a new session */ 

    /* Every output goes to /dev/null. If Redis is daemonized but 
    * the 'logfile' is set to 'stdout' in the configuration file 
    * it will not log at all. */ 
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1) { 
     dup2(fd, STDIN_FILENO); 
     dup2(fd, STDOUT_FILENO); 
     dup2(fd, STDERR_FILENO); 
     if (fd > STDERR_FILENO) close(fd); 
    } 
} 

tài liệu Upstart nói:

expect daemon 
Specifies that the job's main process is a daemon, and will fork twice after being run. 
init(8) will follow this daemonisation, and will wait for this to occur before running 
the job's post-start script or considering the job to be running. 
Without this stanza init(8) is unable to supervise daemon processes and will 
believe them to have stopped as soon as they daemonise on startup. 

expect fork 
Specifies that the job's main process will fork once after being run. init(8) will 
follow this fork, and will wait for this to occur before running the job's post-start 
script or considering the job to be running. 
Without this stanza init(8) is unable to supervise forking processes and will believe 
them to have stopped as soon as they fork on startup. 

Vì vậy, tôi sẽ hoặc tắt daemonization trên Redis bên, hoặc là cố gắng sử dụng mong đợi ngã ba chứ không phải là mong đợi daemon trong cấu hình mới nổi.

+0

Cảm ơn bạn đã trả lời. Nghiên cứu strace của tôi, cũng như quan sát bình thường cho thấy rằng Redis dĩa hai lần. Đọc mã, tôi không thấy làm thế nào có thể, nhưng bằng cách nào đó nó có vẻ. Ngoài ra, tôi đã cố gắng "mong đợi ngã ba" và điều đó đã không dẫn đến PID chính xác được tìm thấy. Tôi đã thấy Gist đó, nhưng người ta không bao giờ có thể tin tưởng rằng những người khác đã làm bài tập ở nhà chuyên sâu để đi đến vấn đề gốc. Tôi cho rằng việc daemon hóa là vấn đề với Upstart. –

+0

Tôi vừa thử một lệnh strace -f src/redis-server redis.conf đơn giản 2> strace.log trên một phiên bản được sao chép, và nó chỉ thực hiện một lần. Xin lưu ý trên Linux, cuộc gọi hệ thống bản sao được sử dụng để tạo cả hai quy trình và luồng (và Redis sử dụng một vài chuỗi nền ngay bây giờ). Các tham số phải làm rõ nếu nó là một luồng hoặc một tiến trình. Quá xấu "mong đợi ngã ba" không hoạt động như chúng tôi mong đợi ... –

+0

Được rồi, cảm ơn xác nhận đó là một ngã ba duy nhất. Tôi chắc chắn đã cố gắng "mong đợi ngã ba" với không thành công, nhưng tôi có thể làm cho một đi của nó chỉ để đảm bảo. Tôi sẽ báo cáo lại. –

6

Các cấu hình mới nổi sau dường như được làm việc đối với tôi, với mới nổi 1.5 trên ubuntu 12.04, với redis.conf daemonize thiết lập để có:

description "redis server" 

start on (local-filesystems and net-device-up IFACE=eth0) 
stop on shutdown 

setuid redis 
setgid redis 
expect fork 

exec /opt/redis/redis-server /opt/redis/redis.conf 

respawn 
+0

Cảm ơn Mike, điều này phù hợp với tôi. –

+0

Kịch bản hoạt động cho tôi, nhưng vẫn là TBD để làm cho nó trở nên tốt đẹp với Monit ... –