現在取り組んでいる C プロジェクト用のサービス スクリプトを作成しており、起動時にいくつかのユーティリティを実行します。ログ ユーティリティを使用してすべての出力を取得したいと考えています。/etc/rc5/myscript に次のようなものがあります
#!/bin/bash
#save fd 1 in fd 3 for use later
exec 3<&1
$SERVICESCRIPT | logger
ロガーは、EOF に達するまで標準入力から読み取るだけです。2 番目のスクリプトは、一連のユーティリティが実行されているかどうかを確認し、独自のいくつかのユーティリティを起動する場所です。これらのユーティリティの中には、フォークしてデーモン プロセスになるものがあります。スクリプトから実行しているので、すべてのスクリプト fds を継承します。これにより、スクリプトが呼び出された後、コマンド ラインに戻らなくなります。
私はいくつかの方法でこれに対抗しようとしました:
まず、デーモンプロセスを開始するスクリプトで、次のことを行いました。
(
exec 4<&-
exec 3<&-
$daemon_process
)
これにより、添え字が起動され、3 と 4 が閉じられ (それぞれ stdout とパイプ出力を格納するために使用されます)、プログラムが実行されます。しかし、コマンドラインに戻ろうとするとまだハングアップするため、パイプが閉じられていないと思われます。さらに調査すると、閉じた後にエコーを配置し、ロガーにパイプされた fd にリダイレクトすると、ログにそれらが表示され、fd が実際にまだ無傷であることがわかります。Cプログラムでfds 2-4を閉じると、コマンドラインに戻るのがわかりますが、これは非常に面倒で不快な修正です。
次に、次のことを試しました。
$daemon_process 4<&- 3<&-
プログラムを呼び出すときにfdsを閉じる必要がありますが、残念ながら、スクリプトがコマンドラインに戻らないという同じ結果が表示されます。
スクリプトが渡されたら、「CTRL-C」を押してコマンドラインに戻すことができますが、これは決して解決策ではありません.
何か案は?
ありがとう!!!!