ons 2014-02-12 klockan 10:47 +1300 skrev Amos Jeffries: > Exactly. More deep changes needed.
Well, systemd (and most other service monitors) do manage services that background themselves as well, just not optimally. So it's more changes desired, not strictly needed. But seriously, it's a very small change to Squid. All systemd and the like needs is that Squid stops all the backgrounding, setsid etc done in watch_child(). The rest is business as usual, including watching childs. I.e. all or most of the following: openlog(APP_SHORTNAME, LOG_PID | LOG_NDELAY | LOG_CONS, LOG_LOCAL4); if ((pid = fork()) < 0) syslog(LOG_ALERT, "fork failed: %s", xstrerror()); else if (pid > 0) exit(0); if (setsid() < 0) syslog(LOG_ALERT, "setsid failed: %s", xstrerror()); closelog(); #ifdef TIOCNOTTY if ((i = open("/dev/tty", O_RDWR | O_TEXT)) >= 0) { ioctl(i, TIOCNOTTY, NULL); close(i); } #endif /* * RBCOLLINS - if cygwin stackdumps when squid is run without * -N, check the cygwin1.dll version, it needs to be AT LEAST * 1.1.3. execvp had a bit overflow error in a loop.. */ /* Connect stdio to /dev/null in daemon mode */ nullfd = open(_PATH_DEVNULL, O_RDWR | O_TEXT); if (nullfd < 0) fatalf(_PATH_DEVNULL " %s\n", xstrerror()); dup2(nullfd, 0); if (Debug::log_stderr < 0) { dup2(nullfd, 1); dup2(nullfd, 2); } Note: Looking at this code I notice that the nullfd is leaked, consuming one more filedescriptor than needed. There should be a close(nullfd); somewhere around here.. for now probably best by using yet another command line option. The opt_no_daemon flag (-N) is far too overloaded and used at a bit too many places today and trying to sort that out is likely to give some more gray hairs. Regards Henrik