私はこのような状況に何度も直面しています。
たとえば、emacs
のファイルをSudo
の権限で開くときに、次を使用します。
Sudo emacs tet.c &
パスワードを尋ねる代わりに、Ubuntuはemacs
ウィンドウまたは端末の出力(pidを除く)なしでemacs
プロセスを開始するだけで、画像を参照します(「&」を使用しない場合はパスワードを聞かれます):
これに関連する2つの質問があります。
「停止したジョブがあります」というエラーが表示された場合はどうすればよいですか?そのような停止したジョブをすべて特定し、それらを強制終了するにはどうすればよいですか?端末をクリアすると、これらの停止したプロセスのPIDはなくなります。
Ubuntu/emacsがこのように動作するのはなぜですか?パスワードを聞かれないのはなぜですか?
There are stopped jobs
メッセージはfar、far awayエラーになります。これは、シェルからの終了を試みることを知らせる単なる通知ですが、1つ以上の中断されたジョブ/プログラムがあります(この場合、emacs
はコマンドの最後に&
を使用してバックグラウンドに配置します)。意図しない限り、システムはシェルを終了してジョブを強制終了させません。このメッセージに応じて、いくつかのことができます。
jobs
コマンドを使用して、中断したジョブを通知しますfg
コマンドを使用して、フォアグラウンドでジョブを追加することを選択できますexit
と入力するだけです。 exit
コマンドを使用して、または使用せずに、もう一度jobs
と入力すると、中断されているすべてのジョブが終了します。2番目の質問に答えるために、Ubuntuやemacsがこのように動作していないことを伝えます。これは、アプリケーションをバックグラウンドで実行する場合の通常の動作です。この場合、Sudo
はパスワードを要求していますが、バックグラウンドで要求しているため、この事実を確認することはできません。確認するには、fg
コマンドを使用して、ジョブをフォアグラウンドに戻す必要があります。
radu@Radu: ~ $ Sudo emacs tet.c &
[1] 7732
radu@Radu: ~ $ # now Sudo emacs run in background so you can't see nothing about what's happening
radu@Radu: ~ $ fg
[Sudo] password for radu:
この後、入力できます Ctrl+Z 必要に応じて、バックグラウンドでジョブを再度配置する。その後、再度「fg」コマンドを実行して、ジョブをフォアグラウンドに戻すことができます。
システムが現在のシェルに関連付けられているアクティブなジョブについて警告するため、メッセージが表示されます。
これらの実行中/停止中のジョブをリストするには、jobs
を実行します。
その後、次のいずれかを実行できます。
fg
(バックグラウンドのbg
の反対)で最後のジョブをフォアグラウンドに移動します。disown
を実行して、これらのジョブを強制終了せずに現在のシェルから削除します。exit
/logout
を2回入力するのと同じ2回kill $(jobs -p)
(強制的に-9
を追加)それらを否認し、停止したすべてのプロセスを強制終了する場合は、次を試してください。
kill $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')
Sudo
に関する質問に答えるために、パスワードを要求しません。これは、 標準入力 からパスワードを受信し、それをバックグラウンドで実行するためにアクティブな端末が必要であるためです。 、シェルはコマンドが終了するまで待機しないため、コマンドを操作する可能性はありません。
この場合、次の3つの可能性があります。
&
)、Sudo -S
によって端末デバイスの代わりに標準入力からパスワードを読み取ります。
echo mypass | Sudo emacs tet.c
visudo
コマンドとsudoers
ファイルを編集して、パスワードを要求しないようにSudoを構成します。参照: ユーザーのNOPASSWD
を有効にする
停止したジョブがありますエラーが発生した場合:
jobs
-->停止ステータスのジョブが表示されますexit
-->と入力すると、ターミナルから出ることができます