
ターミナルから直接実行すると、「&」の有無にかかわらず正常に動作するアプリケーションがあります。ただし、シェル スクリプトから実行しようとすると、末尾の「&」を省略した場合にのみ動作します。したがって、シェル スクリプト内からバックグラウンドでこのプロセスを開始することはできません。
<Path to My application> <options> &
アプリケーション ウィンドウは開きますが、その後は何も進みません。
(このアプリケーションは、qemu 0.13.0 の修正版です (私が修正しました)。シェル スクリプトでバックグラウンドでディスク イメージを実行すると、黒い画面が表示されてしまいます)
答え1
アプリケーションに組み込みオプションがある場合は、アンパサンドを使用してアプリケーションをバックグラウンドにする必要はありません。qemu の場合がこれに該当します (削除しない限り)。
% qemu-kvm --help | grep daemon
-daemonize daemonize QEMU after initializing
答え2
次のようなメッセージが表示されましたか?
[1] suspended (tty output) myapplication
端末で? このメッセージは、プログラムが端末から読み取ろうとしていることを意味します (おそらく標準入力から読み取っているためです)。フォアグラウンド プログラムのみが端末から読み取ることができるため、プログラムは中断されます。
このメッセージが表示された場合は、プログラムが読み取っている理由を調べてください。困った場合は、標準入力 ( myapplication </dev/null
) をリダイレクトしてみてください。
そのようなメッセージが表示されない場合は、プログラムに別のバグがあります。デバッガーまたはを使用して、プログラムが何を実行しているかを確認してくださいstrace
。
答え3
ターミナルからバックグラウンド コマンドを実行する場合とシェル スクリプトから実行する場合には違いがあります。
非対話型シェル(ジョブ制御が無効)では、バックグラウンド コマンドの stdin が暗黙的に からリダイレクトされる/dev/null
ため、コマンドがまったく実行されない可能性があります。
POSIX標準については、シェルコマンド言語: 非同期リスト。
# compare where fd 0 is pointing to
sh -c 'sleep 10 & lsof -p ${!}'
sh -c 'sleep 10 0<&0 & lsof -p ${!}'
sh -c 'set -m; sleep 10 & lsof -p ${!}'
sh -ic 'sleep 10 & lsof -p ${!}'