service starman status starman is dead, but stale PID file exists ps auxwwww | grep starman _starman 11344 0.0 0.6 44396 3664 ? Ss Jul09 0:08 starman master --user _starman --group _starman --daemonize --error-log=/var/log/starman/error.log --access-log=/var/log/starman/access.log --pid /var/run/starman.pid --listen 127.0.0.1:3000 --workers 10 -a /var/www/webapps/test/script/payment_web psgi cat /var/run/starman.pid 11344
starman меняет имя процесса, как и показано в выводе команды ps. start-stop-daemon сверяет то, то что передано в параметре --name с содержимым /proc/<PID>/stat, где содержится первые 15 символов имени процесса, в данном случае это "starman master ". Судя по коду /etc/init.d/functions передать параметр --name с пробелами невозможно, поэтому придётся в init-скрипте starman дублировать код из /etc/init.d/functions для status и stop. Или, как вариант, повесить фич-реквест на service?
(В ответ на комментарий №1) > starman меняет имя процесса, как и показано в выводе команды ps. > > start-stop-daemon сверяет то, то что передано в параметре --name с содержимым > /proc/<PID>/stat, где содержится первые 15 символов имени процесса, в данном > случае это "starman master ". Судя по коду /etc/init.d/functions передать > параметр --name с пробелами невозможно, поэтому придётся в init-скрипте starman > дублировать код из /etc/init.d/functions для status и stop. Или, как вариант, > повесить фич-реквест на service? А чем плох такой вариант --- starman.orig 2013-03-21 12:17:03.856200891 +0000 +++ starman 2013-03-21 12:17:09.314201894 +0000 @@ -31,7 +31,7 @@ stop() { - stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user _starman --retry -15/300 --name starman -- starman + action $"Stopping starman service:" start-stop-daemon --stop --pidfile $PIDFILE RETVAL=$? return $RETVAL }
(In reply to comment #2) > (В ответ на комментарий №1) > > starman меняет имя процесса, как и показано в выводе команды ps. > > > > start-stop-daemon сверяет то, то что передано в параметре --name с содержимым > > /proc/<PID>/stat, где содержится первые 15 символов имени процесса, в данном > > случае это "starman master ". Судя по коду /etc/init.d/functions передать > > параметр --name с пробелами невозможно, поэтому придётся в init-скрипте starman > > дублировать код из /etc/init.d/functions для status и stop. Или, как вариант, > > повесить фич-реквест на service? > > А чем плох такой вариант > > --- starman.orig 2013-03-21 12:17:03.856200891 +0000 > +++ starman 2013-03-21 12:17:09.314201894 +0000 > @@ -31,7 +31,7 @@ > > stop() > { > - stop_daemon --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user > _starman --retry -15/300 --name starman -- starman > + action $"Stopping starman service:" start-stop-daemon --stop --pidfile > $PIDFILE > RETVAL=$? > return $RETVAL > } Тем, что убьет не глядя любой процесс с указанным pid'ом.
(В ответ на комментарий №3) > (In reply to comment #2) > > (В ответ на комментарий №1) > > Тем, что убьет не глядя любой процесс с указанным pid'ом. но pid записал starman при запуске, а не mysql например, убьет он того кого нужно Это что хуже того что init скрипт вообще не может убить starman и приходится делать чтото вроде pkill -9 starman && service starman start если все равно рабочего решения нет а интересно, systemd что убивает не по pid-у который поймал при запуске?
По аналогии со start_daemon, можно добавить --check в stop_daemon и status.
(In reply to comment #4) > а интересно, systemd что убивает не по pid-у который поймал при запуске? systemd завершает все процессы из соответствующей cgroup'ы.
(В ответ на комментарий №5) > По аналогии со start_daemon, можно добавить --check в stop_daemon и status. Давайте добавим