保持bash脚本沿着它已启动的程序运行,并发送程序输入

时间:2010-10-07 15:05:49

标签: bash debian

我正在编写一个非常简单的脚本来控制进程, 脚本检查进程是否正在运行,如果没有:执行它。

我需要在指定的时间后杀死特定的流程实例(非常一个脚本已启动)。 问题是,一旦执行了bash脚本,它就不会运行,直到执行的程序完成。将一些输入传递给进程的能力也很有用,因为我在运行的服务中内置了一个优雅的退出函数。 / p>

基本上,我的bash脚本应该在它启动的过程中运行,并在睡眠x次之后通过stdin发送一个kill命令。

如何将一些脚本输入转发到流程脚本已开始,如何在执行流程后保持脚本运行?

提前致谢。

3 个答案:

答案 0 :(得分:3)

如果要在脚本旁边运行该过程,则需要在后台运行它:

command &
pid=$!

现在pid将包含您刚开始的流程的PID。接下来,您需要一种与流程进行通信的方法。如果您只需要向流程发送一些输入,请使用“此处文档”:

command <<EOF
input
more input
even more input
var=$HOME
EOF

如果您仍需要在后台运行该过程,则会变得更加棘手。将输入写入临时文件(请参阅mktemp(1)):

tmp=$(mktemp)
cat > "$tmp" <<EOF
input
more input
even more input
var=$HOME
EOF
command < "$tmp" &
pid=$!

或者您可以使用命名管道(FIFO)。 This article应该让你开始。

答案 1 :(得分:0)

使用pgrep(请参阅man pgrep查看其功能)

pgrep my_process || ./my_process

答案 2 :(得分:0)

您可以根据需要轻松修改此脚本,但这是一个脚本,它会等待一个进程完成或在有限时间内睡眠后发送电子邮件。

#!/bin/sh
SLEEPTIMEOUT=3600
SLEEPCOUNTER=0
SLEEPLIMIT=5

while ps ax | grep -v grep | grep "yourprocess" > /dev/null
do
sleep $SLEEPTIMEOUT
SLEEPCOUNTER=$((SLEEPCOUNTER+1))
echo $SLEEPCOUNTER
if [ $SLEEPCOUNTER -gt $SLEEPLIMIT ]
then
`echo "slept $SLEEPLIMIT times and waited $SLEEPTIMEOUT seconds each time but process is still running" | mailx -s "waited" $EMAIL`
exit 1
fi
done