为什么ftam服务将从终端启动并返回提示,而不是从bash脚本返回?

时间:2013-01-08 13:09:09

标签: bash service terminal centos

我正在使用bash版本bash 3.0启动ftam服务器(CentOS 5上的ft820.rc),我遇到了从脚本启动它的问题,即在我做的脚本中

ssh -nq root@$ip /etc/init.d/ft820.rc start

并且脚本在此行之后不会继续,但是当我在由$ip

定义的机器上执行时

/etc/init.d/ft820.rc start

我会在服务启动后立即收到提示。

这是在ft820.rc

中开始的代码
  SPOOLPATH=/usr/spool/vertel
  BINPATH=/usr/bin/osi/ft820
  CONFIGFILE=${SPOOLPATH}/ffs.cfg

  # Set DBUSERID to any value at all. Just need to make sure it is non-null for
  # lockclr to work properly.
  DBUSERID=
  export DBUSERID

  # if startup requested then ...
  if [ "$1" = "start" ]
  then
          mask=`umask`
          umask 0000

          # startup the lock manager
          ${BINPATH}/lockmgr -u 16

          # update attribute database
          ${BINPATH}/fua ${CONFIGFILE} > /dev/null

          # clear concurrency locks
          ${BINPATH}/finit -cy ${CONFIGFILE} >/dev/null

          # startup filestore
          ${BINPATH}/ffs ${CONFIGFILE}
          if [ $? = 0 ]
          then
                  echo Vertel FT-820 Filestore running.
          else
                  echo Error detected while starting Vertel FT-820 Filestore.
          fi

          umask $mask

1 个答案:

答案 0 :(得分:1)

我在这里(根据@Patryk的要求)重新发布了我在问题评论中的内容:

“在命令行中执行ssh时是否相同?即,您是否可以在不输入密码的情况下连接,使用一对private_local_key和您之前插入目标根目录的相应public_key @ $ ip :〜/ .ssh / authorized_keys文件? - Olivier Dulac 20小时前“

“你这么说,在命令行(而不是在脚本中)你可以ssh root @ ....并且它可以在不要求你的pwd的情况下工作吗?(即,它可以从脚本运行吗?) - Olivier Dulac 20小时前“

“尝试没有'-n'的ssh,甚至没有-nq:ssh root @ $ ip /etc/init.d/ft820.rc start(你甚至可以添加ssh -v,它会告诉你本地(1 :)和远程(2 :)事件以非常冗长的方式,帮助知道它被卡住的地方) - Olivier Dulac 19小时前“

“还:在脚本中的”ssh ...“行之前,再创建一行,例如:ssh root @ ip”set; pwd; ID ; whoami“并查看它是否有效并显示正确的信息。这可能有助于确保ssh部分正常工作。”set“部分还将显示正在运行的shell(例如:如果它包含BASH =,那么你正在运行bash 。否则SHELL = ...应该提供关于调用哪个shell的良好提示(有时不正确) - Olivier Dulac 19小时前“

“请在没有'-n'的情况下尝试(=在后台运行并等待,而不是仅运行然后退出)。它不起作用,尝试将-t -t -t(3次)添加到ssh,强制它分配一个tty。但首先,请放弃'-n'。 - Olivier Dulac 18小时前“

显然有效的方法是将-t选项添加到ssh命令中。 (你可以设置'-t -t -t'来进一步强制它尝试分配tty,具体取决于具体情况)

我想这是因为调用的命令预计会在交互式会话中运行,因此需要“tty”作为标准输出

一种可能性(但只是一个疯狂的猜测):调用的rc脚本输出信息,但是在缓冲环境中(即,当没有通过终端启动时),调用脚本看不到足够的行来填充缓冲区和开始打印任何东西(比如当你在缓冲环境中做一个“grep something | somethings else”并且在缓冲区足够大以显示任何内容之前ctrl + c:你最终认为grep没有线条,而有也许已经在缓冲区中的几行了。关于缓冲有很多话题,我刚刚开始阅读这一切。强制ssh分配tty使被调用的命令认为它正在输出到实时终端会话,并且可能已关闭缓冲并允许结果显示。也许在第一种情况下,它也有效,但你永远看不到输出?