【问题标题】:Error in shell script : Process cannot be killedshell脚本中的错误:进程无法被杀死
【发布时间】:2014-05-04 01:25:55
【问题描述】:

以下是我的脚本,当我试图杀死一个进程时,我得到了一个错误。错误表明进程不存在:

select case when max(LAST_MODIFIED_DATE) > to_date('$TO_EXTRACT_VALUE', 'YYYY-MM-DD HH24:MI:SS')  then 0
else 1
    end
    from $ORACLE_TABLE;" > $SQL_TMP_FILE

    PID=$(ps -ef | grep sqlplus | head -1 | awk '{print $2}')
    print $PID
    sleep 10  > $SQL_TMP_FILE
    kill -9 $PID > $SQL_TMP_FILE

     #echo "FILE_ID: $FILE_ID"
    check_result=$(sqlplus -S  ${ORA_USERNAME}/${ORA_PASSWORD}@$TNS_NAME < $SQL_TMP_FILE)

下面也是调试后的输出:

select case when max(LAST_MODIFIED_DATE) > to_date('2014-03-25 00:00:00', 'YYYY-MM-DD HH24:MI:SS')  then 0
    else 1
        end
        from SHIPPING_TRANSACTION;
+ 1> /dw/etl/home/dev/tmp/extract/dw_da/check_shplx_stby_sync.dw_shpmt.ssa_shpmt_trans_fact_shpmt_trans.tmpfile
+ + ps -ef
+ grep sqlplus
+ head -1
+ awk {print $2}
PID=2303
+ print 2303
2303
+ sleep 10
+ 1> /dw/etl/home/dev/tmp/extract/dw_da/check_shplx_stby_sync.dw_shpmt.ssa_shpmt_trans_fact_shpmt_trans.tmpfile
+ kill -9 2303
+ 1> /dw/etl/home/dev/tmp/extract/dw_da/check_shplx_stby_sync.dw_shpmt.ssa_shpmt_trans_fact_shpmt_trans.tmpfile
kill: 2303: no such process

谁能帮我解决这个问题

【问题讨论】:

  • 你怎么知道grep sqlplus 没有返回grep sqlplus 命令的PID?毕竟,它确实包含sqlplus,这就解释了为什么它在 10 秒后仍然没有运行。
  • 如果你想避免这种情况,请使用pgrep -- 不要自己通过 ps grep。
  • 另外,避免使用全大写的变量名,除非引用环境变量或内置函数——遵循该规则可以避免命名空间冲突。
  • ...更好的办法是启动您希望它以记录其 PID 或维护锁定文件的方式杀死的特定 sqlplus 命令——这样您就不会冒险杀死其他随机进程他们的名字中恰好有sqlplus(比如vi my-sqlplus-script)。
  • + echo set verify off set feedback off set heading off set pagesize 0 set numwidth 15 select case when max(LAST_MODIFIED_DATE) > to_date('2014-03-26 00:00:00', 'YYYY -MM-DD HH24:MI:SS') then 0 else 1 end from SHIPPING_TRANSACTION; + 1> /dw/etl/home/dev/tmp/extract/dw_shpmt/check_shplx_stby_sync.dw_shpmt.ssa_shpmt_trans_fact_shpmt_trans.tmpfile + pgrep sqlplus + PID=$ dw_adm_dev@zaisetldev01:/dw/etl/home/dev/bin >

标签: bash shell unix kill-process


【解决方案1】:

您应该使用grep sqlplus | grep -v greppgrep sqlplus 而不是grep sqlplus 可能 2303 是 grep 命令的 PID,而不是 sqlplus。

【讨论】:

  • 甚至比“grep |grep -v”更好,因为您可以避免管道和 grep 实例的开销:“grep [s]qlplus” 这匹配“sqlplus”,但不匹配自身。
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 2017-01-23
  • 2016-07-08
  • 2012-09-30
  • 2013-11-11
  • 2012-10-11
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多