(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
それらを別の場所にリダイレクトできます。