2012-07-04 58 views
1

我想是这样的:条件执行和重定向在bash

maybeexec command arg1 arg2 &> /logs/log 

凡maybeexec是一个bash的功能,像这样:

maybeexec() { 
    if ! ps ax | grep -v grep | grep "$*" > /dev/null 
    then 
    "[email protected]" 
    fi 
} 

所以基本上,它会检查是否command arg1 arg2已经运行,并如果是这样,不会运行它。

我的问题,不过,是即使command arg1 arg2已经运行等maybeexec不会同时运行它,/logs/log仍然打开重定向和将覆盖现有的/logs/log,我不想要的。

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

谢谢!

回答

1

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

请在脚本中使用proper process management而不是ps。这种方法不好。要按名称搜索进程,您应该使用pgrep,但这不应该在脚本中完成。

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

+0

我切换到使用,而不是羊群,谢谢。 –

1

你需要重写代码一点点。在函数内部进行重定向,而不是在外部。对重定向的目标被指定为函数(稍后将与shift被删除)的第一个参数NOE:

maybeexec /logs/log command arg1 arg2 

maybeexec() { 
    LOG=$1 
    shift 
    if ! ps ax | grep -v grep | grep "$*" > /dev/null 
    then 
    "[email protected]" >& $LOG 
    fi 
}