如何启动golang应用程序的upstart进程?

时间:2016-07-04 05:54:26

标签: linux go amazon-ec2 upstart

我正在使用upstart来启动我的golang应用程序。我有这样的应用程序文件夹结构,

   web-app/
         /app
             main.go

我构建了如下应用程序,

$cd /home/ec2-user/go/src/github.com/dineshappavoo/web-app/app/
$go build ./...

它生成了二进制文件app

并将web-app.conf放在/etc/init/文件夹中。这是web-app.conf内容,

#Web app upstart script
description "start and stop web app"

start on (net-device-up
and local-filesystems
and runlevel [2345])

stop on runlevel [016]

respawn
respawn limit 5 30

console output

script
    chdir /home/ec2-user/go/src/github.com/dineshappavoo/web-app/app
    exec ./app
end script

当我尝试sudo initctl list时,它将进程列为stop/waiting。我试图开始这个过程

$ sudo initctl start web-app

它将过程显示为start/running。但它还没有开始。

我检查了/var/log/messages日志。它显示,

init: web-app main process (18740) terminated with status 127

我无法启动这个过程。我认为chdir存在一些问题。过去两天我尝试了不同的选择。我对新贵很新,但没有运气。有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:2)

OP解决了几个问题后最终解决了问题。请参阅评论,特别是:

  • upstart可能无法识别环境变量
  • Amazon Linux Image目前使用旧版本的init(新贵0.6.5),缺少#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <getopt.h> #include <string.h> int main(int argc, char *argv[]) { char *optarg; int ch; char *indir = NULL; while ((ch = getopt(argc, argv, "d:")) != -1) { switch(ch) { case 'd': indir = optarg; fprintf(stderr, "Optarg: %s\n", optarg); fprintf(stderr, "Dir name: %s\n", indir); break; default : fprintf(stderr, "Usage: test -d <input directory>\n"); exit(1); } } if(indir == NULL){ fprintf(stderr, "Input directory required.\n"); exit(1); } else{ printf("Input dir: %s\n", indir); } return 0; } &amp;等新功能。嵌套脚本标签

  • 如果exec找不到二进制文件

  • ,则可能出现状态127 如果二进制运行但,
  • 状态1可能会发生
  • 替换upstart脚本中的简单程序可以帮助诊断错误