用nohup执行命令很困惑?

时间:2011-08-06 08:51:10

标签: shell ssh nohup

我的剧本:

#!/bin/bash
. /home/was/.bash_profile
export PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/was/bin:/wasdata/oracle/10.2.0/client_1/bin:

  sqlplus "mon_system/monsystem@10.10.4.90" <<eof 
  set echo off
  set feedback off
  set serveroutput on 
  set term off
  set sqlprompt ""
  set linesize 200
  spool /wasdata/scripts/systeminf/tmp-was-restart.sh
  exec prc_auto_restart
eof
  sed -i '/prc_auto_restart/d' tmp-was-restart.sh
  /wasdata/scripts/systeminf/tmp-was-restart.sh
  cat /dev/null>/wasdata/scripts/systeminf/tmp-was-restart.sh

过程是:

  1. 登录数据库以执行程序“prc_auto_restart”
  2. 程序将输出 /wasdata/scripts/systeminf/tmp-was-restart.sh
  3. 执行/wasdata/scripts/systeminf/tmp-was-restart.sh
  4. tmp-was-restart.sh会喜欢:

    ssh was1@10.10.4.212 "ps -ef|grep was1.*WebSphere.*c01_ship_s01|grep -v "grep">>kill.log;ps -ef|grep was1.*WebSphere.*c01_ship
    _s01|grep -v "grep"|awk '{print \"kill -9 \" \$2}'|sh" 
    

    当我直接执行脚本时,脚本可以工作:

    [was@web-tkt2-01 systeminf]$ ./prod-auto-restart.sh 
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Sat Aug 6 16:33:08 2011
    
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
    With the Partitioning, Real Application Clusters, OLAP and Data Mining options
    
    SQL> SQL> SQL> SQL> SQL> ssh -t -t was1@10.10.4.212 "ps -ef|grep was1.*WebSphere.*c01_ship_s01|grep -v "grep">>kill.log;ps -ef|grep was1.*WebSphere.*c01_ship_s01|grep -v "grep"|awk '{print \"kill -9 \" \$2}'|sh"
    Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
    With the Partitioning, Real Application Clusters, OLAP and Data Mining options
    Connection to 10.10.4.212 closed.
    [was@web-tkt2-01 systeminf]$ 
    

    但是当我使用nohup来执行脚本时:

    [was@web-tkt2-01 systeminf]$ nohup prod-auto-restart.sh &
    [1] 29983
    [was@web-tkt2-01 systeminf]$ nohup: appending output to `nohup.out'
    
    
    [1]+  Stopped                 nohup prod-auto-restart.sh
    [was@web-tkt2-01 systeminf]$ 
    [was@web-tkt2-01 systeminf]$ 
    [was@web-tkt2-01 systeminf]$ ps -ef|grep autp
    was      30014 27492  0 16:33 pts/4    00:00:00 grep autp
    [was@web-tkt2-01 systeminf]$ ps -ef|grep auto
    was      29983 27492  0 16:33 pts/4    00:00:00 /bin/bash prod-auto-restart.sh
    was      30003 29983  0 16:33 pts/4    00:00:00 /bin/bash prod-auto-restart.sh
    was      30021 27492  0 16:33 pts/4    00:00:00 grep auto
    

    它会分叉两个shell,我检查tmp-was-restart.sh,这是正确的,这意味着 命令sed -i '/prc_auto_restart/d' tmp-was-restart.sh执行正确,并且它停在/wasdata/scripts/systeminf/tmp-was-restart.sh,我尝试使用源/执行方法,两者都不起作用,在我终止进程29983后,命令/wasdata/scripts/systeminf/tmp-was-restart.sh被执行,但是cat /dev/null>/wasdata/scripts/systeminf/tmp-was-restart.sh未执行,非常困惑!!!

1 个答案:

答案 0 :(得分:1)

Stopped消息的最常见原因是脚本期望通过命令行从用户输入,通常是read命令。我在您发布的代码中没有看到任何内容,因此如果有任何子脚本不可见,请在那里查看read。脚本收到“Ctrl-S”(停止)字符的可能性要小得多?信号。

你对sqlplus的使用看起来是正确的,但是我无法访问sqlplus来测试任何理论,所以请仔细检查sqlplus的cmd-line用法文档,也许有一个-n选项(或其他)表示'没有cmd-line interaction'。

最后,也许shell调试模式可以帮助你。

在脚本顶部附近尝试PS4='$LINENO>'; set -vx。需要一点学习才能弄清楚如何读取输出。 -v选项会显示正在评估的代码块,if .. ; then ; ... else ; ... fiwhile ... done或只是一个管道。

我希望这会有所帮助。

P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。