[Twisted-Python] How to restart Twisted service in-process
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
On Feb 2, 2017, at 1:17 AM, Роман Мещеряков <romanmescheryakov@yandex.ru> wrote:
Hello everyone! I wrote Twisted-based TCP server which is capable of running in several relatively different modes. When mode switch is needed, I would like the server to restart itself by some means, for it to read new mode from configuration file and create corresponding implementation. Also I wanted the restart to occur without re-running twistd process, because it seems to me more appropriate for Linux daemon.
Hi Roman, Sorry it took a while to get to this one :). If your solution is working for you, then it's fine. You've correctly understood the API associated with IServiceCollection and your implementation (at least at first glance, I don't have time to test it exhaustively :)) is correct. However, there's a more philosophical question as well: if you really want to re-start from scratch, what exactly are you shutting down and starting up again? Wouldn't you want to be able to load new code? Simply stopping and starting objects won't re-initialize the process from the beginning, only from some indeterminate middle state where parts of the program are already set up; this doesn't have the usual desired effect of a "restart" where potentially unknown or buggy state is cleared away. You may want to consider simply calling execv https://docs.python.org/2.7/library/os.html#os.execv <https://docs.python.org/2.7/library/os.html#os.execv> with [sys.executable] + sys.argv rather than trying to do this in terms of Twisted's APIs. -glyph
![](https://secure.gravatar.com/avatar/607cfd4a5b41fe6c886c978128b9c03e.jpg?s=120&d=mm&r=g)
On Sat, Feb 18, 2017 at 2:25 PM, Glyph Lefkowitz <glyph@twistedmatrix.com> wrote:
Or better yet. Don't be afraid to just exit. Your process is being managed by a supervisor with a rich feature set - like easily controlled re-restart behavior, right (If not, what do you do when your daemon simply *crashes*)? Jean-Paul
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
If you're actually daemonizing ('twistd' without '-n') then there might be a small issue. However, a modern best practice is to never daemonize; this is why the new `twist` runner (which you should probably switch to) doesn't daemonize and expects your supervisor to handle backgrounding.
Or better yet. Don't be afraid to just exit. Your process is being managed by a supervisor with a rich feature set - like easily controlled re-restart behavior, right (If not, what do you do when your daemon simply crashes)?
Well, in fact I'm in the development stage now and did't have time to deal with this question yet :) As of now I understand very little about daemons and their supervisors (I belive it is systemd for Raspbian...).
Yes, systemd will do this.
Jean-Paul and Glyph, thank you for guiding me in the right direction! :)
Happy to help! -g
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
twistd writes a .pid file and then attempts to check whether another process on the system has the same PID contained in that file while starting up, to avoid conflicts. Yours is an odd case, because the process with that process-ID is the _current_ process, and perhaps the check ought to even be modified to account for this. Two other options you have are: switch to `twist`, which doesn't write a pidfile use the option "--pidfile ''" to disable writing a pidfile. I strongly suggest the first option :). -glyph
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
On Mar 1, 2017, at 9:46 AM, Роман Мещеряков <romanmescheryakov@yandex.ru> wrote:
Then the next question is: how to run my .tac file with twist? I don't see option like '-y' in it's --help output.
We haven't implemented .tac files for `twist` yet; you can either add that feature :) or you can write a twist plugin. (It's the same as a twistd plugin.) -glyph
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
On Feb 2, 2017, at 1:17 AM, Роман Мещеряков <romanmescheryakov@yandex.ru> wrote:
Hello everyone! I wrote Twisted-based TCP server which is capable of running in several relatively different modes. When mode switch is needed, I would like the server to restart itself by some means, for it to read new mode from configuration file and create corresponding implementation. Also I wanted the restart to occur without re-running twistd process, because it seems to me more appropriate for Linux daemon.
Hi Roman, Sorry it took a while to get to this one :). If your solution is working for you, then it's fine. You've correctly understood the API associated with IServiceCollection and your implementation (at least at first glance, I don't have time to test it exhaustively :)) is correct. However, there's a more philosophical question as well: if you really want to re-start from scratch, what exactly are you shutting down and starting up again? Wouldn't you want to be able to load new code? Simply stopping and starting objects won't re-initialize the process from the beginning, only from some indeterminate middle state where parts of the program are already set up; this doesn't have the usual desired effect of a "restart" where potentially unknown or buggy state is cleared away. You may want to consider simply calling execv https://docs.python.org/2.7/library/os.html#os.execv <https://docs.python.org/2.7/library/os.html#os.execv> with [sys.executable] + sys.argv rather than trying to do this in terms of Twisted's APIs. -glyph
![](https://secure.gravatar.com/avatar/607cfd4a5b41fe6c886c978128b9c03e.jpg?s=120&d=mm&r=g)
On Sat, Feb 18, 2017 at 2:25 PM, Glyph Lefkowitz <glyph@twistedmatrix.com> wrote:
Or better yet. Don't be afraid to just exit. Your process is being managed by a supervisor with a rich feature set - like easily controlled re-restart behavior, right (If not, what do you do when your daemon simply *crashes*)? Jean-Paul
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
If you're actually daemonizing ('twistd' without '-n') then there might be a small issue. However, a modern best practice is to never daemonize; this is why the new `twist` runner (which you should probably switch to) doesn't daemonize and expects your supervisor to handle backgrounding.
Or better yet. Don't be afraid to just exit. Your process is being managed by a supervisor with a rich feature set - like easily controlled re-restart behavior, right (If not, what do you do when your daemon simply crashes)?
Well, in fact I'm in the development stage now and did't have time to deal with this question yet :) As of now I understand very little about daemons and their supervisors (I belive it is systemd for Raspbian...).
Yes, systemd will do this.
Jean-Paul and Glyph, thank you for guiding me in the right direction! :)
Happy to help! -g
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
twistd writes a .pid file and then attempts to check whether another process on the system has the same PID contained in that file while starting up, to avoid conflicts. Yours is an odd case, because the process with that process-ID is the _current_ process, and perhaps the check ought to even be modified to account for this. Two other options you have are: switch to `twist`, which doesn't write a pidfile use the option "--pidfile ''" to disable writing a pidfile. I strongly suggest the first option :). -glyph
![](https://secure.gravatar.com/avatar/e1554622707bedd9202884900430b838.jpg?s=120&d=mm&r=g)
On Mar 1, 2017, at 9:46 AM, Роман Мещеряков <romanmescheryakov@yandex.ru> wrote:
Then the next question is: how to run my .tac file with twist? I don't see option like '-y' in it's --help output.
We haven't implemented .tac files for `twist` yet; you can either add that feature :) or you can write a twist plugin. (It's the same as a twistd plugin.) -glyph
participants (3)
-
Glyph Lefkowitz
-
Jean-Paul Calderone
-
Роман Мещеряков