非同期で実行すると、プロセスは中断されます。

非同期で実行すると、プロセスは中断されます。

始めたかったのですが、忘れてしまったプロセスがありました。同期的に実行すると、次のようになります。

sudo -E lein run

これは無期限にうまく機能します。非対話型です。ポート80でWebサーバーを起動します。しかし、私が実行したとき:

sudo -E lein run &

ターミナル出力:

[4] 30236

数秒後:

[4] + 30236 suspended (tty input) sudo -E ../bin/lein run

私のプロセスはポート80でWebサーバーを起動する必要がありますが、サーバーは表示されません。

Q:何が起こっているのか、どうやって診断しますか?私はstdoutとstderrが印刷されないと思いますが、間違っている可能性があります。プロセスが一時停止されたのはなぜですか?非同期的に実行できるlein run他の方法はありますか?

答え1

このsudoコマンドは、ttyを介してユーザーと会話できることを期待しています。バックグラウンドにプッシュすると、ttyへの排他アクセスが必要ですが、もはや排他アクセスがないため停止します。 (これはセキュリティインターフェイスであり、パスワードが必要な場合があり、ユーザーアカウントへのさまざまなアクセス権でプログラムを実行します。重要なのは、ユーザーに排他的なアクセス権があることです。)

プログラムは、screen「実際の」ttyに必ずしも関連付けられる必要はない仮想ttyを提供する以下で実行できます。

screen -md sudo -E lein run

答え2

バックグラウンドプロセスは端末からデータを読み取ることができません。データを読み取ろうとすると SIGTTIN(ティーエラーティータイプ存在するを置く)信号。この機能があるのは、複数のプロセスが端末からデータを読み取ろうとすると、各文字がデフォルトでプロセスの1つにランダムに移動するためです。これは役に立つ動作ではありません。したがって、フォアグラウンドプロセスは入力を受け取りますが、バックグラウンドプロセスは入力を受け取りません。

(少し簡素化しました。お読みください。制御端子そしてターミナル出入管理より正確な仕様が欲しいが、上に書いたより深く掘り下げなければならない状況はほとんど起こりません。 )

sudo がパスワードの入力を求めるために端末からデータを読み取ろうとすると中断されます。フォアグラウンドでsudoを実行してからバックグラウンドに切り替える必要があります。

通常、シェルを実行してからバックグラウンドでコマンドを実行するように指示できます。たとえば、su次のようにできますsu -c 'lein run &'。しかし、sudoの作者はこれが一般的な問題であることを知っているので、次のオプションがあります。-bオプションを次に渡すsudo

sudo -b -E lein run

同様に、パスワードの入力を求められたら、バックグラウンドに移動を使用sshできます。-fこれにより、バックグラウンドプロセスはシェル操作になりません。バックグラウンドでプログラムを実行して忘れたい場合に適しています。

関連情報