我正在编写一个非常简单的脚本来控制进程, 脚本检查进程是否正在运行,如果没有:执行它。
我需要在指定的时间后杀死特定的流程实例(非常一个脚本已启动)。 问题是,一旦执行了bash脚本,它就不会运行,直到执行的程序完成。将一些输入传递给进程的能力也很有用,因为我在运行的服务中内置了一个优雅的退出函数。 / p>
基本上,我的bash脚本应该在它启动的过程中运行,并在睡眠x次之后通过stdin发送一个kill命令。
如何将一些脚本输入转发到流程脚本已开始,如何在执行流程后保持脚本运行?
提前致谢。
答案 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