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

コードを少し書き直す必要があります。外部ではなく、関数内でリダイレクトを行います。リダイレクトのターゲットは、関数の最初の引数として指定された noe です (後で で削除されます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 やその他のハッキングを除く)。

スクリプトではなく、適切なプロセス管理を使用してください。psこのアプローチは良くありません。プロセスを名前で検索するには、 を使用する必要がpgrepありますが、スクリプトでも決して実行しないでください。

参照: http://wiki.bash-hackers.org/howto/mutex および: http://mywiki.wooledge.org/BashFAQ/045

于 2012-07-04T03:07:23.877 に答える