SSHを介してUbuntu 12.04クラウドサーバーに接続し、次のようにWebサーバーを起動しました(bashを使用)。
$ nohup python tserver.py &
[2] 2122
$ nohup: ignoring input and appending output to `nohup.out'
コマンドを実行するとプロンプトが消えます。空行が1つだけです。 「Enter」を押してプロンプトを復元できます。つまり、Enterを押した後に$が再び表示されます。しかし、これらのコマンドのいくつかをスクリプトで作成したい(複数のWebサーバーインスタンスを開く)。だから、「入力コマンドの送信」などのスクリプトを書くのは好きではありません。ここで何が起こっているのでしょうか?ヒントが欠けているのはなぜですか?これらの一連のコマンドをどのようにスクリプトで記述できますか?
答え1
アプリケーションをバックグラウンドに置き、アプリケーションが出力を生成しています。あなたのメッセージはまだ存在し、追加のコンテンツが表示されるだけです。
たとえば、
$ ( sleep 1 && echo hello ) &
[1] 24764
$ █
その後、1秒遅れて次のようになります。
$ ( sleep 1 && echo hello ) &
[1] 24764
$ hello
█
出力は単にecho
端末に書き込まれ、現在カーソルがある場所に表示されます。シェルは出力が表示されたことを知らない。出力が存在しないかのように入力を続けることができます(読み取りだけが難しくなります)。
しかし、きれいな解決策は出力をリダイレクトすることです。
nohup python tserver.py >/dev/null 2>&1 &
答え2
ステートメントを介してバックグラウンドでプログラムを開始しましたが、&
バックグラウンドプロセスの出力は依然として現在の端末の標準出力として指定されています。
これは、プロンプトがecho '\r\n'
(次のプロンプトが完全に消えた場合は現在行を上書きする)またはecho "Someotherstuff"
(Someotherstuff
プロンプトの前に印刷してから端末の次の行に移動する)のようなもので上書きされていることを意味します。
を押すとENTER改行文字のみが入力され、プロンプトが再印刷されます。