Apa yang harus saya lakukan ketika saya mendapatkan kesalahan 'Ada pekerjaan yang terhenti'?


64

Saya menghadapi situasi seperti ini berkali-kali.

Misalnya, setiap kali saya mencoba membuka beberapa file emacsdengan sudohak menggunakan:

sudo emacs tet.c &

Alih-alih meminta saya untuk kata sandi, Ubuntu hanya memulai emacsproses tanpa emacsjendela atau keluaran apa pun di terminal (kecuali untuk pid) melihat gambar (jika saya tidak menggunakan '&' maka itu akan meminta saya untuk kata sandi):

masukkan deskripsi gambar di sini

Saya punya dua pertanyaan yang terkait dengan ini:

  1. Apa yang harus saya lakukan ketika saya mendapatkan kesalahan bahwa 'Ada pekerjaan yang terhenti'? Bagaimana cara saya mengidentifikasi semua pekerjaan yang berhenti dan membunuh mereka? Setelah saya membersihkan terminal, saya tidak akan mendapatkan pid dari proses yang terhenti ini.

  2. Mengapa Ubuntu / emacs berperilaku seperti ini? Mengapa tidak meminta saya untuk memasukkan kata sandi?

Jawaban:


79

There are stopped jobspesan jauh, jauh untuk menjadi kesalahan. Ini hanya pemberitahuan yang memberi tahu Anda bahwa Anda berusaha keluar dari shell, tetapi Anda memiliki satu atau lebih pekerjaan / program yang ditangguhkan (dalam kasus emacsAnda yang Anda gunakan sebagai latar belakang &di akhir perintah Anda). Sistem tidak memungkinkan Anda untuk keluar dari shell dan mematikan pekerjaan kecuali jika Anda bermaksud melakukannya. Anda dapat melakukan beberapa hal dalam menanggapi pesan ini:

  • gunakan jobsperintah untuk memberi tahu Anda pekerjaan apa yang telah Anda tangguhkan
  • Anda dapat memilih untuk menambahkan pekerjaan di latar depan menggunakan fgperintah
  • jika Anda tidak peduli apakah pekerjaan itu akan berakhir, Anda bisa mengetik exitlagi; mengetik exitkedua kalinya dengan atau tanpa jobsperintah intervensi akan menghasilkan penghentian semua pekerjaan yang ditangguhkan.

Untuk menjawab pertanyaan kedua, saya akan memberi tahu Anda bahwa Ubuntu atau emacs tidak berperilaku seperti ini. Ini adalah perilaku normal ketika Anda meletakkan aplikasi untuk berjalan di latar belakang. Dalam hal sudoini meminta kata sandi, tetapi meminta di latar belakang, sehingga Anda tidak dapat melihat fakta ini. Untuk melihatnya, Anda harus membawa kembali pekerjaan di latar depan menggunakan fgperintah:

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:

Setelah ini, Anda dapat mengetik Ctrl+ Zuntuk menempatkan kembali pekerjaan di latar belakang jika diinginkan. Kemudian Anda dapat menjalankan lagi perintah 'fg' untuk membawa kembali pekerjaan di latar depan dan seterusnya.


Bagi saya, selalu telnet. Saya lupa quit:) (lihat superuser.com/questions/486496/how-do-i-exit-telnet )
cmroanirgo

1
Jadi, saya hanya menekan Ctrl + d dua kali (!) Dan mendapat pesan yang sama setelah yang pertama. Apakah ada cara untuk mencari tahu apa pekerjaan yang baru saja saya bunuh?
Matsmath

19

Anda mendapat pesan, karena sistem memperingatkan Anda tentang pekerjaan aktif yang terkait dengan shell Anda saat ini.

Anda bisa daftar ini berjalan / berhenti pekerjaan dengan menjalankan: jobs,

Maka Anda dapat melakukan salah satu dari yang berikut:

  • pindahkan pekerjaan terakhir ke latar depan dengan: fg(kebalikan dari bguntuk latar belakang),
  • jalankan disownuntuk menghapus pekerjaan ini dari shell Anda saat ini tanpa membunuh mereka,
  • paksa logout dengan mematikan tugas-tugas ini dengan menekan Ctrl+Ddua kali, sama dengan mengetik exit/ logoutdua kali,
  • matikan pekerjaan ini secara manual dengan menjalankan: kill $(jobs -p)(menambah -9kekuatan)
  • jika Anda menolaknya, dan Anda ingin tetap membunuh semua proses yang terhenti, coba:

    kill $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')


Untuk menjawab pertanyaan sudo, ia tidak akan menanyakan kata sandi, karena mengharuskan terminal aktif untuk menerima kata sandi dari input standar , dan dengan menjalankannya sebagai latar belakang, shell tidak menunggu perintah selesai , jadi Anda tidak memiliki kemungkinan untuk berinteraksi dengan perintah.

Dalam hal ini, Anda memiliki 3 kemungkinan:

  • jalankan perintah tanpa masuk ke latar belakang ( &),
  • baca kata sandi dari input standar dan bukan perangkat terminal dengan sudo -Smis

    echo mypass | sudo emacs tet.c
    
  • konfigurasikan sudo untuk tidak meminta kata sandi dengan: visudoperintah dan mengedit sudoersfile. Lihat: Aktifkan NOPASSWDuntuk pengguna


6

Ketika Anda menemukan ada kesalahan pekerjaan yang berhenti :

  1. ketik jobs-> Anda akan melihat pekerjaan dengan status berhenti
  2. lalu ketik exit-> Anda bisa keluar dari terminal
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.