[SOLVED] Intermediate Python : `signal` Module
Some of you may already be familiar with Mod-Bot. If you are not - allow me to explain a couple of things, so that this question may be a bit easier to understand. Mod-Bot is a program that listens for bot-commands to be entered by users on Discord. It is hosted by a web-service called Heroku (a server that keeps it alive & operational 24/7). Mod-Bot's source-code is stored on GitHub. I have Heroku & GitHub linked in such a way, that whenever I push changes/updates to the GitHub repository - the Heroku app (Mod-Bot) is automatically redeployed/rebooted. I am only aware of two ways to reboot the bot: a) to push changes to the GitHub repository, and b) to navigate to Heroku directly and redeploying it manually (what the Mod-Bot Admins do whenever the bot gets fussy). However, while reading the app's logs, I've noticed a few things. When the app is redeployed, it'll list out the steps it's taking into the app's logs in real time. Example: https://www.sololearn.com/post/1070667 "Stopping all processes with SIGTERM", "Process exited with status 143", and "Starting process with command `python3 main.py`" are outputted to the logs during every reboot (whether rebooted automatically (it cycles every 24 hours) or manually). Following a bit of research, I've learned that SIGTERM is in reference to one of Python's modules "signal" after importing the "signal" module and entering `print(signal.__dict__.keys())`. After noting the information & example above, my question is as follows: Given the information above, is it possible to use `signal.SIGTERM` to reboot an application (that is *not* running on my local machine) by executing a command from the command-line (in Discord)? If so, how might it be done programmatically? How might I go about directly identifying/referencing a process prior to restarting it (programmatically)?
5/5/2021 3:37:51 AMFox
4 AnswersNew Answer
Maybe I am off the marks, but it seems like you could use the "Restart Dyno" API of Heroku. https://devcenter.heroku.com/articles/platform-api-reference#dyno The example there is for cURL but you can also invoke a REST API from Python. https://www.nylas.com/blog/use-python-requests-module-rest-apis/
I just woke up and began doing more research and found exactly what you just mentioned Tibor Santa, Lol. I was on my way here to share the news about figuring it out and I see that you already did. I'll be adding a command that includes something like the following: os.system('curl -n -X DELETE https://api.heroku.com/apps/$appname/dynos/worker.1 -H "Content-Type: application/json" -H "Accept: application/vnd.heroku+json; version=3"') I just tested it using the `mod.console` command and it was successful. It's strange that I didn't find that until now. I mean, you'd think that out of all of the Google-searches I've done - I would've found it sooner. *shrug*
Fox I'm glad you managed to solve it ;) I am not too familiar with Heroku, but with these cloud services most of the time there are plenty of options to remote control them, even in a scriptable way, via a CLI (command line interface) or API (usually REST these days)... So this is always worth exploring as a first guess.