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.
Nguồn
2011-12-30 13:20:23
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. –
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 ... –
Đượ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. –