Proses di latar belakang tanpa "&"

24

Katakanlah Anda memulai aplikasi baru di Linux (seperti editor teks, dll.), Tetapi Anda lupa untuk menggunakan "&". Perintah apa yang akan Anda gunakan untuk membuat proses itu berjalan di latar belakang, sementara TIDAK harus TUTUP aplikasi itu? Dengan cara ini, Anda dapat membuat kedua proses terbuka dan bekerja secara terpisah (mis. Terminal baris perintah yang Anda gunakan untuk membuat proses dan proses seperti editor teks masih berjalan.?

D0uble7
sumber
Secara teknis tidak tetapi mungkin tmuxmemberikan fungsionalitas yang sama seperti yang diinginkan dalam pertanyaan Anda.
mkc
1
Jangan mengabaikan alternatif sederhana untuk membuka shell lain jika memungkinkan.
jpmc26

Jawaban:

43

Di jendela terminal Anda biasanya mengetik Control+Z untuk "menangguhkan" proses dan kemudian menggunakan bgperintah untuk "latar belakang" itu.

misalnya dengan perintah tidur

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

Kita dapat melihat proses sedang berjalan dan saya masih memiliki baris perintah saya.

Stephen Harris
sumber
5
Mungkin menarik untuk menambahkan bahwa proses dapat dibawa kembali ke latar depan dengan fgperintah, yang mengambil id pekerjaan (ditentukan dalam tanda kurung, 1dalam hal ini) sebagai parameter. Ini tidak spesifik untuk penggunaan bgdan dapat dilakukan pada proses yang diluncurkan dengan &.
Aaron
14

Ctrl+ Zadalah cara untuk melakukannya, tetapi hanya untuk kelengkapan: pertanyaannya menanyakan "perintah", dan itu adalah (dari terminal lain):

kill -STOP pid_of_the_running_applications

dan tentu saja

bg

dari terminal aplikasi.

Radovan Garabík
sumber
6
kil-STOP, lalu bunuh -CONT
Michel Billaud
10

Di Bash:

Ctrl+ Zlalubg .

Sekarang jalankan jobsdan lihat hasilnya.

Tomasz
sumber
2
@grooveplex Tomas menjawab lebih dulu, jadi akan lebih tepat untuk berkomentar di bawah jawaban Stephen, bahwa pada dasarnya jawabannya adalah tomas` dengan lebih detail.
Anthon
2
Kami sebenarnya menjawab secara bersamaan. Tidak mengherankan kami berdua mengatakan hal yang sama karena itu adalah jawaban yang jelas :-) Tak satu pun dari kami yang menyalin. Jawaban saya tiba tak lama setelah Thomas karena saya telah menghabiskan waktu ekstra untuk membuat dan memformat contoh.
Stephen Harris
1
Dan kata saya itu ada di Bash, jadi tidak sama.
Tomasz
1
Heh, ada titik potensial di sana. Itu memang membutuhkan shell untuk memiliki kontrol pekerjaan. Beberapa mesin pertama yang saya kerjakan (berbasis SVr2) tidak memiliki itu /bin/shdan jadi ini tidak akan bekerja :-)
Stephen Harris
1

Sebagai tindakan pencegahan untuk ketidaknyamanan karena harus menekan CTRL- z, Anda dapat membuat skrip pembungkus untuk editor yang akan menjalankan editor Anda di latar belakang. Dengan cara ini Anda tidak perlu mengingat untuk memulainya di latar belakang secara eksplisit:

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

Di atas kami pertama-tama mencoba untuk menentukan apakah Anda memiliki server X tersedia dan hanya kemudian menjalankan editor di latar belakang (jika tidak, banyak editor Unix akan menggunakan terminal Anda dan Anda tidak ingin menjalankan editor sebagai proses latar belakang dalam kasus ini) . Ini akan meneruskan semua argumen ke editor pilihan Anda kata demi kata ("$@" ) sama seperti yang Anda berikan untuk skrip wrapper.

Adapun perintah yang Anda lewatkan ... Per eksperimen dasar saya, untuk program GUI yang tidak melibatkan terminal, bisa sesederhana pengiriman pertama SIGSTOPdan kemudian SIGCONTke proses latar depan (menggunakan killperintah jika Anda menggunakan skrip shell untuk mengimplementasikan ini) . Anda tentu saja perlu menjalankannya di jendela / tab terminal lain, dan kesulitannya adalah dengan mudah dan dengan cara umum menemukan PID yang ingin Anda kirimi sinyal. Anda dapat secara default mengirim dua sinyal ke semua proses dari nama yang diberikan (default ke editor favorit Anda dan memungkinkan menggunakan PID sebagai argumen juga):

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

Metode ini memberi saya tab terminal dengan benar setelah menjalankan (beberapa) emacs perintah di latar belakang. Tetapi proses emacs yang berjalan di terminal tidak dipulihkan dengan benar karena kontrol pekerjaan shell atau kebingungan pengaturan terminal. Jadi metode ini akan mendapat manfaat dari beberapa kecanggihan.

The SIGSTOPpersis apa yang mengirim ke proses latar depan ketika Anda menekan (oleh default umum) CTRL- z. Lihat stty -aoutput

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(keluaran disingkat) dan sttyhalaman manual:

   susp CHAR
          CHAR will send a terminal stop signal

Proses yang berhenti menggunakan SIGSTOPsinyal dapat dimulai kembali dengan mengirim SIGCONT. Biasanya itu adalah logika kontrol pekerjaan shell yang akan mengirim SIGCONTdan menangani manipulasi lain yang diperlukan fgdan bgperintah yang kita abaikan.

FooF
sumber