元のプロセスの子ではない新しいプロセスを起動するにはどうすればいいですか? 質問する

元のプロセスの子ではない新しいプロセスを起動するにはどうすればいいですか? 質問する

(OSX 10.7) 私たちが使用しているアプリケーションでは、アプリケーション内で特定のアクティビティが発生したときに呼び出されるスクリプトを割り当てることができます。 bash スクリプトを割り当てて呼び出していますが、問題は、いくつかのコマンドを実行し、30 秒待ってからさらにいくつかのコマンドを実行する必要があることです。 bash スクリプトに「sleep 30」を実行させると、スクリプトが終了するのを待つ間、アプリケーション全体が 30 秒間フリーズします。

30秒の待機(および2番目のコマンドセット)を別のスクリプトに入れて「./secondScript &」を呼び出しましたが、アプリケーションは30秒間何もせずに待機しています。アプリケーションはスクリプトを待っていると思います。およびすべての子プロセス終了します。

メイン スクリプト内から 2 番目のスクリプトを呼び出すために、次のバリエーションを試しましたが、すべて同じ問題が発生します。

  • nohup ./secondScript &
  • ( ( ./secondScript & ) & )
  • ( ./secondScript & )
  • nohup スクリプト -q /dev/null secondScript &

アプリケーションを変更して、スクリプトを起動して完了を待たないように指示する機能はありません。

新しいプロセスが現在のプロセスの子にならないように、プロセスを起動するにはどうすればよいでしょうか (プロセスはスクリプト言語で実行することをお勧めします)?

ありがとう、クリス

追伸: 「disown」コマンドを試してみましたが、これも役に立ちませんでした。私のメイン スクリプトは次のようになります。

[initial commands]
echo Launching second script
./secondScript &
echo Looking for jobs
jobs
echo Sleeping for 1 second
sleep 1
echo Calling disown
disown
echo Looking again for jobs
jobs
echo Main script complete

出力は次のようになります:

Launching second script
Looking for jobs
[1]+ Running ./secondScript &
Sleeping for 1 second
Calling disown
Looking again for jobs
Main script complete

この時点で、呼び出し元のアプリケーションは secondScript が終了するまで 45 秒間待機します。

pps

メイン スクリプトの先頭で「ps」を実行すると、別のターミナル ウィンドウで開いている対話型 bash セッションのプロセス ID のみが返されます。

$SHELLの値は/bin/bashです

「ps -p $$」を実行すると、正しく表示されます

PID   TTY TIME    CMD
26884 ??  0:00.00 mainScript

「lsof -p $$」を実行すると、さまざまな結果が表示されます (関連性がないと想定して、すべての列をここに貼り付けたわけではありません)。

FD   TYPE   NAME
cwd  DIR    /private/tmp/blahblahblah
txt  REG    /bin/bash
txt  REG    /usr/lib/dyld
txt  REG    /private/var/db/dyld/dyld_shared_cache_x86_64
0    PIPE   
1    PIPE   -> 0xffff8041ea2d10
2    PIPE   -> 0xffff 8017d21cb
3r   DIR    /private/tmp/blahblah
4r   REG    /Volumes/DATA/blahblah
255r REG    /Volumes/DATA/blahblah

ベストアンサー1

Unixでこれを行う典型的な方法は、ダブルフォークです。bashでは、次のように実行できます。

( sleep 30 & )

(..)子プロセスを作成し、&孫プロセスを作成します。子プロセスが終了すると、孫プロセスは init によって継承されます。


これが機能しない場合は、アプリケーションが子プロセスを待機していません。

他に待機している可能性のあるものとしては、セッションと開いているロック ファイルがあります。

新しいセッションを作成するには、Linux には がありますsetsid。OS X では を通じて実行できる場合がありますがscript、これもまた新しいセッションを作成します。

# Linux:
setsid sleep 30

# OS X:
nohup script -q -c 'sleep 30' /dev/null &

継承されたファイル記述子のリストを検索するには、 を使用しますlsof -p yourpid。次のような出力が表示されます。

sleep   22479 user    0u   CHR 136,32      0t0       35 /dev/pts/32
sleep   22479 user    1u   CHR 136,32      0t0       35 /dev/pts/32
sleep   22479 user    2u   CHR 136,32      0t0       35 /dev/pts/32
sleep   22479 user    5w   REG  252,0        0  1048806 /tmp/lockfile

この場合、標準の FD 0、1、2 に加えて、親が待機できるロック ファイルで開かれた fd 5 もあります。

fd 5 を閉じるには、 を使用できますexec 5>&-。ロック ファイルが stdin/stdout/stderr 自体である可能性がある場合は、 を使用してnohupそれらを別の場所にリダイレクトできます。

おすすめ記事