Ada pekerjaan yang berhenti (saat keluar dari bash)


158

Saya mendapatkan pesan There are stopped jobs.ketika saya mencoba keluar dari bash shell kadang-kadang. Berikut ini adalah skenario yang dapat direproduksi dalam python 2.x:

  • ctrl+ cditangani oleh juru bahasa sebagai pengecualian.
  • ctrl+ z'menghentikan' prosesnya.
  • ctrl+ dkeluar python untuk real.

Berikut adalah beberapa keluaran terminal dunia nyata:

example_user@example_server:~$ python
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ctrl+z

[1]+  Stopped                 python
example_user@example_server:~$ exit
logout
There are stopped jobs.

Bash tidak keluar, saya harus exitkembali untuk keluar dari bash shell.

  • T: Apa itu 'pekerjaan yang dihentikan', atau apa artinya ini?
  • T: Dapatkah proses yang dihentikan dilanjutkan?
  • T: Apakah yang pertama exitmembunuh pekerjaan yang dihentikan?
  • T: Apakah ada cara untuk keluar dari shell pertama kali? (tanpa memasukkan exitdua kali)

ctrl + shift + \ juga akan membuat python keluar.
ThorSummoner

Jawaban:


206

Pekerjaan yang dihentikan adalah pekerjaan yang sementara waktu diletakkan di latar belakang dan tidak lagi berjalan, tetapi masih menggunakan sumber daya (yaitu memori sistem). Karena pekerjaan itu tidak melekat pada terminal saat ini, itu tidak dapat menghasilkan output dan tidak menerima input dari pengguna.

Anda dapat melihat pekerjaan yang telah Anda jalankan menggunakan jobsperintah builtin di bash, mungkin shell lain juga. Contoh:

user@mysystem:~$ jobs
[1] + Stopped                python
user@mysystem:~$ 

Anda bisa melanjutkan pekerjaan yang dihentikan dengan menggunakan fgperintah built-in (foreground) bash. Jika Anda memiliki beberapa perintah yang telah dihentikan, Anda harus menentukan yang mana untuk melanjutkan dengan melewati nomor jobspec pada baris perintah fg. Jika hanya satu program yang dihentikan, Anda dapat menggunakannya fgsendiri:

user@mysystem:~$ fg 1
python

Pada titik ini Anda kembali ke juru bahasa python dan dapat keluar dengan menggunakan control-D.

Sebaliknya, Anda dapat killperintah dengan itu jobspec atau PID. Misalnya:

user@mysystem:~$ ps
  PID TTY          TIME CMD
16174 pts/3    00:00:00 bash
17781 pts/3    00:00:00 python
18276 pts/3    00:00:00 ps
user@mysystem:~$ kill 17781
[1]+  Killed                  python
user@mysystem:~$ 

Untuk menggunakan jobspec, awali angka tersebut dengan kunci persen (%):

user@mysystem:~$ kill %1
[1]+  Terminated              python

Jika Anda mengeluarkan perintah keluar dengan pekerjaan yang berhenti, peringatan yang Anda lihat akan diberikan. Pekerjaan akan dibiarkan berjalan untuk keselamatan. Itu untuk memastikan Anda sadar Anda sedang mencoba untuk membunuh pekerjaan yang mungkin Anda lupakan bahwa Anda berhenti. Kali kedua Anda menggunakan perintah keluar, pekerjaan dihentikan dan shell keluar. Ini dapat menyebabkan masalah untuk beberapa program yang tidak dimaksudkan untuk dibunuh dengan cara ini.

Dalam bash tampaknya Anda dapat menggunakan logoutperintah yang akan mematikan proses yang terhenti dan keluar. Ini dapat menyebabkan hasil yang tidak diinginkan.

Perhatikan juga bahwa beberapa program mungkin tidak keluar ketika diakhiri dengan cara ini, dan sistem Anda bisa berakhir dengan banyak proses yatim yang menggunakan sumber daya jika Anda terbiasa melakukan hal itu.

Perhatikan bahwa Anda dapat membuat proses latar belakang yang akan berhenti jika mereka membutuhkan input pengguna:

user@mysystem:~$ python &
[1] 19028
user@mysystem:~$ jobs
[1]+  Stopped                 python

Anda dapat melanjutkan dan membunuh pekerjaan ini dengan cara yang sama seperti Anda melakukan pekerjaan yang Anda hentikan dengan Ctrl-zinterupsi.


4
Saya akan berdalih dengan kalimat kedua Anda. Seharusnya dikatakan, ”Karena pekerjaan dihentikan , tidak dapat mengambil tindakan apa pun - file I / O, I / O jaringan, terminal I / O, atau pemrosesan lainnya.”
Scott

2
Ini sangat membantu saya.
shellbye

Pos luar biasa bagus membantu siapa pun!
George Udosen

18

T: Apa itu 'pekerjaan yang dihentikan', atau apa artinya ini?

Pekerjaan yang dihentikan berarti proses yang menerima sinyal stop ( SIGSTOP/ SIGTSTP) dari keyboard (karakter suspend Ctrl-Z), perintah (misalnya kill -STOP [PID]) atau proses lain (mis. Kernel ketika sistem kekurangan sumber daya) dan ia dalam kondisi jeda, sehingga memberitahu sistem untuk berhenti / menunda suatu proses sehingga tidak akan melakukan eksekusi / pemrosesan.

Pekerjaan shell aktif dapat terdaftar oleh: jobs.

T: Dapatkah proses yang dihentikan dilanjutkan?

Proses yang terhenti hanya akan melanjutkan eksekusinya jika mengirim SIGCONTsinyal. Ini dapat dicapai dengan fg(atau fg ID) yang akan memindahkan pekerjaan ke latar depan menjadikannya pekerjaan saat ini, bguntuk melanjutkannya di latar belakang, atau dengan mengirim SIGCONTsinyal (misalnya kill -CONT [PID]).

T: Apakah pintu keluar pertama membunuh pekerjaan yang berhenti?

Pertama kali ketika Anda mengetik exit/ logoutatau menekan Ctrl-D, shell mencetak pesan peringatan tentang pekerjaan aktif saat ini yang terkait dengan terminal Anda, karena itu tidak akan membunuh Anda yang tanpa izin Anda dengan mengonfirmasi tindakan kedua kalinya. Jika checkjobsopsi ini diaktifkan ( shopt -s checkjobs), ia juga dapat mencantumkan pekerjaan dengan statusnya.

T: Apakah ada cara untuk keluar dari shell pertama kali? (tanpa memasuki pintu keluar dua kali)

Anda dapat menekan Ctrl+Ddua kali atau menahannya lebih lama, ini akan keluar dari shell quiet dengan cepat membunuh pekerjaan shel / shel yang terhenti saat ini.

Atau tidak mengakui mereka ( disown) untuk meninggalkan mereka atau membunuh mereka secara manual: kill $(jobs -p).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.