1

我想要这样的东西:

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仍然会打开以进行重定向,并且会覆盖现有的/logs/log,这是我不想要的。

解决这个问题的最优雅的方法是什么?如果可能的话,我想像现在一样继续调用maybeexec,因为我使用它来运行许多命令,这些命令都将输出重定向到不同的文件。

谢谢!

4

2 回答 2

1

你需要稍微重写你的代码。在函数内部而不是外部进行重定向。重定向的目标没有指定为函数的第一个参数(稍后将使用 删除shift):

maybeexec /logs/log command arg1 arg2

maybeexec() {
  LOG=$1
  shift
  if ! ps ax | grep -v grep | grep "$*" > /dev/null
  then
    "$@" >& $LOG
  fi
}
于 2012-07-04T05:17:33.140 回答
1

我不明白你的函数试图做什么,或者你的重定向问题是什么。进程启动后,文件描述符表不能在外部修改(GDB 和其他 hack 除外)。

请使用正确的进程管理而不是ps在脚本中。这种方法不好。要按名称搜索进程,您应该使用pgrep,但这也不应该在脚本中完成。

另见:http ://wiki.bash-hackers.org/howto/mutex 和: http: //mywiki.wooledge.org/BashFAQ/045

于 2012-07-04T03:07:23.877 回答