Использование nohup для выполнения команды очень запутано? - PullRequest
1 голос
/ 06 августа 2011

мой сценарий:

#!/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

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

Он разветвляется на две оболочки, и я проверяю 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 Ответ

1 голос
/ 08 августа 2011

Самая распространенная причина сообщения Stopped заключается в том, что скрипт ожидает ввода от пользователя через командную строку, обычно это команда read.Я не вижу ничего в коде, который вы разместили, поэтому, если какие-либо дочерние скрипты не видны, отметьте здесь read.Гораздо менее вероятно, что скрипт получил символ Ctrl-S (стоп) или?Сигнал.

Ваше использование sqlplus выглядит корректно, но у меня нет доступа к sqlplus для проверки каких-либо теорий, поэтому дважды проверьте документацию по использованию cmd-строки в sqlplus, возможно, есть опция -n(ИЛИ другое), чтобы указать «нет взаимодействия с cmd-строкой».

Наконец, возможно, вам поможет режим отладки оболочки.

Попробуйте PS4='$LINENO>'; set -vx в верхней части скрипта.Требуется немного обучения, чтобы понять, как читать вывод.Опции -v отображают оцениваемый блок кода, либо if .. ; then ; ... else ; ... fi ,, или while ... done, либо просто один конвейер.

Надеюсь, это поможет.

PS по мере появлениячтобы быть новым пользователем, если вы получите ответ, который поможет вам, не забудьте пометить его как принятый и / или дать ему + (или -) в качестве полезного ответа.

...