Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Upstart:在启动序列期间,在启动后脚本节中使用命令替换时出错_Linux_Ubuntu_Sh_Upstart - Fatal编程技术网

Linux Upstart:在启动序列期间,在启动后脚本节中使用命令替换时出错

Linux Upstart:在启动序列期间,在启动后脚本节中使用命令替换时出错,linux,ubuntu,sh,upstart,Linux,Ubuntu,Sh,Upstart,我在upstart中看到一个问题,即在启动后脚本节中使用命令替换会导致错误(syslog报告“以状态1终止”),但仅在初始系统启动期间 我试过使用几乎所有的启动事件挂钩。本地文件系统和网络设备运行正常,大约1/100次尝试都没有出错,所以看起来像是竞争条件。它在手动启动/停止时工作正常。我看到的触发错误的命令替换是一个简单的cat或date,我尝试了使用$()方式和backtick方式。我也尝试过在赛前使用睡眠来战胜比赛条件,但那没有任何效果 我正在使用Win7主机在VMWare上运行Ubunt

我在upstart中看到一个问题,即在启动后脚本节中使用命令替换会导致错误(syslog报告“以状态1终止”),但仅在初始系统启动期间

我试过使用几乎所有的启动事件挂钩。本地文件系统和网络设备运行正常,大约1/100次尝试都没有出错,所以看起来像是竞争条件。它在手动启动/停止时工作正常。我看到的触发错误的命令替换是一个简单的cat或date,我尝试了使用$()方式和backtick方式。我也尝试过在赛前使用睡眠来战胜比赛条件,但那没有任何效果

我正在使用Win7主机在VMWare上运行Ubuntu11.10。已经花了太多时间对此进行故障排除。。。有人有什么想法吗

以下是我的.conf文件供参考:

start on runlevel [2345]
stop on runlevel [016]

env NODE_ENV=production
env MYAPP_PIDFILE=/var/run/myapp.pid

respawn

exec start-stop-daemon --start --make-pidfile --pidfile $MYAPP_PIDFILE --chuid node-svc --exec /usr/local/n/versions/0.6.14/bin/node /opt/myapp/live/app.js >> /var/log/myapp/audit.node.log 2>&1

post-start script
    MYAPP_PID=`cat $MYAPP_PIDFILE`
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] + Started $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_EVENTS=$UPSTART_EVENTS" >> /var/log/myapp/audit.upstart.log
end script

post-stop script
    MYAPP_PID=`cat $MYAPP_PIDFILE`
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] - Stopped $UPSTART_JOB [$MYAPP_PID]: PROCESS=$PROCESS UPSTART_STOP_EVENTS=$UPSTART_STOP_EVENTS EXIT_SIGNAL=$EXIT_SIGNAL EXIT_STATUS=$EXIT_STATUS" >> /var/log/myapp/audit.upstart.log
end script

我能想到的最可能的情况是,
$MYAPP_PIDFILE
尚未创建

因为您没有指定“expect”节,所以一旦主进程分叉并执行,就会运行post start。因此,正如您所怀疑的,在运行节点的启动停止守护进程和写入该pidfile和分叉、执行以及再次分叉到exec之间可能存在一场竞赛

正确的方法是重写您的开机自检:

post-start script
  for i in 1 2 3 4 5 ; do
    if [ -f $MYAPP_PIDFILE ] ; then
      echo ...
      exit 0
    fi
    sleep 1
  done
  echo "timed out waiting for pidfile"
  exit 1
end script

值得注意的是,在Upstart 1.4(首先包含在ubuntu12.04中)中,Upstart添加了日志功能,因此无需将输出重定向到特殊的日志文件中。所有控制台输出默认为
/var/log/upstart/$upstart\u JOB.log
(由logrotate旋转)。因此,这些回声可能只是简单的回声。

我能想到的最可能的情况是,
$MYAPP_PIDFILE
尚未创建

因为您没有指定“expect”节,所以一旦主进程分叉并执行,就会运行post start。因此,正如您所怀疑的,在运行节点的启动停止守护进程和写入该pidfile和分叉、执行以及再次分叉到exec之间可能存在一场竞赛

正确的方法是重写您的开机自检:

post-start script
  for i in 1 2 3 4 5 ; do
    if [ -f $MYAPP_PIDFILE ] ; then
      echo ...
      exit 0
    fi
    sleep 1
  done
  echo "timed out waiting for pidfile"
  exit 1
end script

值得注意的是,在Upstart 1.4(首先包含在ubuntu12.04中)中,Upstart添加了日志功能,因此无需将输出重定向到特殊的日志文件中。所有控制台输出默认为
/var/log/upstart/$upstart\u JOB.log
(由logrotate旋转)。因此,这些回音可能只是简单的回音。

这里不需要命令替换,
date
可以很好地打印内容<代码>日期-u+“[%Y-%M-%Dt%t.3NZ]-启动$UPSTART\u作业[$MYAPP\u PID]:进程=$PROCESS UPSTART\u事件=$UPSTART\u事件”>>/var/log/MYAPP/audit.UPSTART.log。。。假设您的变量不包含任何需要转义的%-序列。是的,我可能能够避免用命令替换date,但据我所知,不能用命令替换cat。如果我能找到一种方法,在不使用命令替换的情况下将PID输入日志条目,那么你说我可以绕过整个问题的权利。你在这里真的不需要命令替换,
date
可以很好地打印内容<代码>日期-u+“[%Y-%M-%Dt%t.3NZ]-启动$UPSTART\u作业[$MYAPP\u PID]:进程=$PROCESS UPSTART\u事件=$UPSTART\u事件”>>/var/log/MYAPP/audit.UPSTART.log。。。假设您的变量不包含任何需要转义的%-序列。是的,我可能能够避免用命令替换date,但据我所知,不能用命令替换cat。如果我能找到一种方法,在不替换命令的情况下将PID输入日志条目,那么你说的对,我可以绕过整个问题。我喜欢这种思路,但是如果我完全删除cat命令,date命令的存在仍然会触发错误。我喜欢这种思路,但是如果我完全删除cat命令,date命令仍然会触发错误。