Repository: Pylons/pyramid

Issue:
pserve --stop-daemon does not work with --monitor-restart
If pserve is started with --monitor-restart, the command is restarted when pserve --stop-daemon is run and the pid file's process ID is not updated. The only way to seem to stop it is using kill on the process ID instead of relying on pserve.



Discussion:
```
pserve --pid-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpju6x4A --stop-daemon
Traceback (most recent call last):
  File "/Users/Shared/AndrewShared/Development/Python/env/bin/pserve", line 8, in <module>
    load_entry_point('pyramid==1.4', 'console_scripts', 'pserve')()
  File "/Users/Shared/AndrewShared/Development/Python/env/lib/python2.7/site-packages/pyramid/scripts/pserve.py", line 50, in main
    return command.run()
  File "/Users/Shared/AndrewShared/Development/Python/env/lib/python2.7/site-packages/pyramid/scripts/pserve.py", line 177, in run
    return self.stop_daemon()
  File "/Users/Shared/AndrewShared/Development/Python/env/lib/python2.7/site-packages/pyramid/scripts/pserve.py", line 467, in stop_daemon
    kill(pid, signal.SIGTERM)
OSError: [Errno 3] No such process
```

The pid_file contains "8814". Running a "ps" here are the processes running afterwards:

```
  UID   PID  PPID   C STIME   TTY           TIME CMD
 7980  8809     1   0 10:30AM ??         0:00.24 /Users/Shared/AndrewShared/Development/Python/env/bin/python /Users/Shared/AndrewShared/Development/Python/env/bin/pserve --pid-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpju6x4A --log-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpWMeX3m --daemon --reload --monitor-restart development.ini
 7980  9130     1   0 10:31AM ??         0:03.77 /Users/Shared/AndrewShared/Development/Python/env/bin/python /Users/Shared/AndrewShared/Development/Python/env/bin/pserve --pid-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpju6x4A --log-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpWMeX3m --daemon --reload --monitor-restart development.ini
 7980  9170  8809   0 10:31AM ??         0:00.20 /Users/Shared/AndrewShared/Development/Python/env/bin/python /Users/Shared/AndrewShared/Development/Python/env/bin/pserve --pid-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpju6x4A --log-file /var/folders/9y/1x5r3v2x6c1_ng0m0s7n3s1c0007sc/T/tmpWMeX3m --daemon --reload --monitor-restart development.ini
```

As you can see, the process has started with a new process ID

Just a note that you also use --reload which according to issue #912 is not supported when using --daemon.

@mmerickel and I have fixed the use of `--monitor-restart` with `--daemon`. Don't think it will work with `--reload`.

Either way, this feature is being deprecated.


Resolving patch:
diff --git a/pyramid/scripts/pserve.py b/pyramid/scripts/pserve.py
--- a/pyramid/scripts/pserve.py
+++ b/pyramid/scripts/pserve.py
@@ -302,7 +302,10 @@ def run(self):  # pragma: no cover
                 raise ValueError(msg)
             writeable_pid_file.close()
 
-        if getattr(self.options, 'daemon', False):
+        if (
+            getattr(self.options, 'daemon', False) and
+            not os.environ.get(self._monitor_environ_key)
+        ):
             self._warn_daemon_deprecated()
             try:
                 self.daemonize()
@@ -311,15 +314,18 @@ def run(self):  # pragma: no cover
                     self.out(str(ex))
                 return 2
 
+        if (
+            not os.environ.get(self._monitor_environ_key) and
+            self.options.pid_file
+        ):
+            self.record_pid(self.options.pid_file)
+
         if (
                 self.options.monitor_restart and
                 not os.environ.get(self._monitor_environ_key)
         ):
             return self.restart_with_monitor()
 
-        if self.options.pid_file:
-            self.record_pid(self.options.pid_file)
-
         if self.options.log_file:
             stdout_log = LazyWriter(self.options.log_file, 'a')
             sys.stdout = stdout_log


Test patch: