始めたかったのですが、忘れてしまったプロセスがありました。同期的に実行すると、次のようになります。
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
これにより、バックグラウンドプロセスはシェル操作になりません。バックグラウンドでプログラムを実行して忘れたい場合に適しています。