英文:
How to run a go app continously on an Ubuntu server
问题
在这里似乎找不到直接的答案。
我不确定是否应该将"./myBinary"作为Cron进程运行,还是应该运行"go run myapp.go"。
确保它始终运行的有效方法是什么?
抱歉,我习惯于使用Apache和Nginx。
此外,部署Go应用的最佳实践是什么?我希望所有内容(最好)都在同一台服务器上提供,就像我的开发环境一样。
我读到另一篇文章中提到了使用S3,但是我真的不想使用S3。
英文:
Couldn't seem to find a direct answer around here.
I'm not sure if I should run ./myBinary as a Cron process or if I should run "go run myapp.go"
What's an effective way to make sure that it is always running?
Sorry I'm used to Apache and Nginx.
Also what are best practices for deploying a Go app? I want everything (preferably) all served on the same server. Just like how my development environment is like.
I read something else that used S3, but, I really don't want to use S3.
答案1
得分: 5
使用您的初始进程提供的功能。您可能正在运行带有Systemd或Upstart的系统。它们都有非常简单的服务描述,并且可以确保您的应用以正确的权限运行,当任何事情发生故障时重新启动,并正确处理输出。
对于快速的Upstart描述,请点击这里,您的服务描述可能只需如下:
start on runlevel [2345]
stop on runlevel [!2345]
setuid 您的应用程序运行的用户名
exec /path/to/your/app --options
对于快速的Systemd描述,请点击这里,您的服务可能只需如下:
[Unit]
Description=您的服务
[Service]
User=您的应用程序运行的用户名
ExecStart=/path/to/your/app --options
[Install]
WantedBy=multi-user.target
英文:
Use the capabilities your init process provides. You're likely running system with either Systemd or Upstart. They've both got really easy descriptions of services and can ensure your app runs with the right privileges, is restarted when anything goes down, and that the output is are handled correctly.
For quick Upstart description look here, your service description is likely to be just:
start on runlevel [2345]
stop on runlevel [!2345]
setuid the_username_your_app_runs_as
exec /path/to/your/app --options
For quick Systemd description look here, your service is likely to be just:
[Unit]
Description=Your service
[Service]
User=the_username_your_app_runs_as
ExecStart=/path/to/your/app --options
[Install]
WantedBy=multi-user.target
答案2
得分: 0
你可以将它放在一个无限循环中,例如:
#! /bin/sh
while true; do
go run myapp.go
sleep 2 # 以防万一
done
因此,一旦应用由于某种原因停止运行,它将会再次运行。
你可以将它放在一个脚本中,并在后台运行:
$ nohup ./my-script.sh >/dev/null 2>&1 &
英文:
You can put it in an inifiny loop, such as:
#! /bin/sh
while true; do
go run myapp.go
sleep 2 # Just in case
done
Hence, once the app dies due some reason, it will be run again.
You can put it in a script and run it in background using:
$ nohup ./my-script.sh >/dev/null 2>&1 &
答案3
得分: 0
你可能想要使用类似screen的虚拟终端工具。示例:
screen -S myapp # 创建名为myapp的screen
cd ... # 切换到你的应用程序目录
go run myapp.go # 或者使用go install,然后从go bin目录运行./myapp
Ctrl-a+d # 退出screen
如果你想返回到screen:
screen -r myapp
编辑:这个解决方案将在你退出终端时保持进程,但如果进程崩溃,它不会重新启动。
英文:
You may want to go for virtual terminal utility like screen here. Example:
screen -S myapp # create screen with name myapp
cd ... # to your app directory
go run myapp.go # or go install and then ./myappfrom go bin dir
Ctrl-a+d # to go out of screen
If you want to return to the screen:
screen -r myapp
EDIT: this solution will persist the process when you go out of terminal, but won't restart it when it'll crash.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论