誰かがすでに質問していると思っていたので、この質問を投稿するのをためらっていましたが、多くの精査の後、空になったので、ここにあります.
背景: 少数のスクリプト/コマンドをリモートで実行できるようにするローカル エージェント (C で記述され、TCP 経由でリッスン) を実行しています。(具体的には、Web インターフェース経由。) スクリプト自体は、バイナリ、bash、または perl スクリプトの混合物であり、リストで許可されている限り、エージェント自体はあまり気にしません。
(これは企業の内部ネットワーク上にあり、これは非常に初期の段階にあるため、現時点ではセキュリティのメリットについて議論しないでください。)
プロセスを起動する C エージェント コードは次のとおりです。
sprintf(mrun, "%s %s 2>&1", file, args);
mexec = popen(mrun, "r");
[read some returned buffer]
pclose(mexec);
このアプローチは、スクリプトがコマンドを実行する (またはフォアグラウンドで実行する) だけであれば、外部の bash スクリプトと perl スクリプトの両方でうまく機能します。ただし、最近、スクリプトを拡張してデーモン (この場合は名前付き) の再起動を含める必要がありました。
スクリプト自体 (bash) は単純です。
#!/bin/bash
pkill -9 named
/local/mnt/named/sbin/named -c /local/mnt/named/var/named.conf &
echo "restarted"
私が直面している問題は、C エージェント経由で実行するとスクリプトが終了しない (つまり、再起動してもエコーされない) ため、制御が返されず、TCP ソケットが解放されないことです。エージェントに関する限り、プロセスはまだ実行中です。ターミナルからスクリプトを実行すると、正常に動作し、制御が返されます。
Cデーモンからフォークされたときとbashターミナルから呼び出されたときにスクリプトを正常に実行できるようにする何かが欠けていますか?
私は nohup を知っており、他のすべてが失敗した場合はそれを使用できると思いますが、これを行うための他の種類の回避策があるかどうか興味がありました。