「&」があるかどうかにかかわらず、端末で直接実行するとうまく動作するアプリケーションがあります。ただし、シェルスクリプトで実行しようとすると、次の「&」をスキップする場合にのみ機能します。したがって、シェルスクリプト内からバックグラウンドでこのプロセスを開始することはできません。
<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 ${!}'