我想要这样的事情:
maybeexec command arg1 arg2 &> /logs/log
其中maybeexec是一个bash函数,如下所示:
maybeexec() {
if ! ps ax | grep -v grep | grep "$*" > /dev/null
then
"$@"
fi
}
所以基本上它会检查command arg1 arg2
是否已经在运行,如果是,则不会运行它。
我的问题是,即使command arg1 arg2
已经在运行,因此maybeexec
没有同时运行它,/logs/log
仍会打开重定向,并会覆盖现有的{{} 1}},我不想要。
解决这个问题最优雅的方法是什么?如果可能的话,我想像现在一样继续调用/logs/log
,因为我使用它来运行许多将输出重定向到不同文件的命令。
谢谢!
答案 0 :(得分:1)
我不明白您的功能尝试做什么或重定向问题是什么。启动进程后,无法在外部修改文件描述符表(GDB和其他黑客除外)。
请在脚本中使用proper process management代替ps
。这种方法并不好。要按名称搜索进程,您应该使用pgrep
,但这绝不应该在脚本中完成。
另见:http://wiki.bash-hackers.org/howto/mutex 并且:http://mywiki.wooledge.org/BashFAQ/045
答案 1 :(得分:1)
您需要稍微重写一下代码。在函数内部进行重定向,而不是在外部。重定向的目标是noe指定为函数的第一个参数(稍后将使用shift
删除):
maybeexec /logs/log command arg1 arg2
maybeexec() {
LOG=$1
shift
if ! ps ax | grep -v grep | grep "$*" > /dev/null
then
"$@" >& $LOG
fi
}