【问题标题】:Redirecting output in shell script from subprocess with simulated ctrl-c使用模拟 ctrl-c 从子进程重定向 shell 脚本中的输出
【发布时间】:2016-03-28 20:07:57
【问题描述】:

我正在编写一个 shell 脚本,它设置一些参数并调用一个 python 脚本。有时 python 脚本挂起,当我按 ctrl-c 时,它会生成一些错误输出。我正在尝试将其写入文件。当我执行 shell 脚本并按 ctrl-c 时,我会在重定向文件中得到输出,但是如果我尝试通过休眠一段时间并终止进程来模拟 ctrl-c,则输出不会重定向到文件。我使用了 SO 中的一些示例来执行睡眠和终止工作,但输出文件没有我从 ctrl-c 手动操作得到的错误。

我无法更改此脚本正在执行的 python 脚本,所以我必须在调用脚本中实现它。

[ -z "$1" ] && echo "No environment argument supplied" && exit 1
. env_params.txt
. run_params.txt


echo "========================================================== RUN STARTED AT $B =========================================================="  >> $OUTFILE
echo "    " >> $OUTFILE

export RUN_COMMAND="$PYTHON_SCRIPT_LOC/pyscript.py PARAM1=VALUE1 PARAM2=VALU2 PAram3=value3"

echo "Run command from test.sh $RUN_COMMAND"    >> $OUTFILE
echo "    " >> $OUTFILE
echo "    " >> $OUTFILE
echo "========================================================== Running Python script =========================================================="  >> $OUTFILE

echo "Before python command"

###############################################
( python $RUN_COMMAND  >> $OUTFILE  2>&1  )  & pid=$!

   SLEEP_TIME=1m
   echo "before sleep - sleeping for $SLEEP_TIME $pid"
   ( sleep $SLEEP_TIME && kill -HUP $pid ) 2>/dev/null & watcher=$!
   if wait $pid 2>/dev/null; then
   echo "after sleep - sleeping for $SLEEP_TIME $pid"
      echo "your_command finished"
      pkill -HUP -P $watcher
      wait $watcher
   else
       echo "after sleep - sleeping for $SLEEP_TIME $pid"
       echo "your_command interrupted"
   fi

### also tried this - did not work either
### python $RUN_COMMAND  >> $OUTFILE  2>&1 &; (pythonPID=$! ; sleep 1m ;kill -s 2 $pythonPID) 
 .
 .

我需要进行哪些更改,以便在脚本本身中终止进程时将输出写入 $OUTFILE,而不是在终端上按 ctrl-c?

【问题讨论】:

  • 这不可能做我需要做的事吗?

标签: bash shell redirect output


【解决方案1】:

您可能不想使用SIGHUP(在控制终端上检测到挂起或控制进程死亡,而是

SIGINT        2       Term    Interrupt from keyboard

更多信息请阅读man 7 signal

【讨论】:

  • 如您所见,(从我的帖子底部),我也尝试过,但这也不适用于重定向输出。不过谢谢你的回答
  • @adbdkb - 你的python $RUN_COMMAND >> $OUTFILE 2>&1 & (pythonPID=$! ; sleep 1m ;kill -s 2 $pythonPID) 在删除错位的; 后为我工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2016-09-22
相关资源
最近更新 更多