it-swarm-id.com

Bagaimana saya bisa menjalankan perintah yang akan selamat dari penutupan terminal?

Terkadang saya ingin memulai suatu proses dan melupakannya. Jika saya memulainya dari baris perintah, seperti ini:

redshift

Saya tidak bisa menutup terminal, atau itu akan mematikan prosesnya. Bisakah saya menjalankan perintah sedemikian rupa sehingga saya bisa menutup terminal tanpa membunuh prosesnya?

339
Matthew

Salah satu dari 2 berikut ini harus berfungsi:

$ Nohup redshift &

atau

$ redshift &
$ disown

Lihat berikut ini untuk informasi lebih lanjut tentang cara kerjanya:

342
Steven D

Jika program Anda sudah berjalan Anda dapat menjeda dengan Ctrl-Z, tarik ke latar belakang dengan bg dan kemudian disown itu, seperti ini:

$ sleep 1000
^Z
[1]+  Stopped                 sleep 1000
$ bg
$ disown
$ exit
147
Stefan

Jawaban yang bagus sudah diposting oleh @StevenD, namun saya pikir ini mungkin akan sedikit memperjelasnya.

Alasan bahwa proses tersebut terbunuh pada terminasi terminal adalah bahwa proses yang Anda mulai adalah proses anak terminal. Setelah Anda menutup terminal, ini akan membunuh proses anak ini juga. Anda dapat melihat pohon proses dengan pstree, misalnya saat menjalankan kate & dalam Konsole:

init-+
     ├─konsole─┬─bash─┬─kate───2*[{kate}]
     │         │      └─pstree
     │         └─2*[{konsole}]

Untuk membuat proses kate terlepas dari konsole ketika Anda mengakhiri konsole, gunakan Nohup dengan perintah, seperti ini:

Nohup kate &

Setelah menutup konsole, pstree akan terlihat seperti ini:

init-+
     |-kate---2*[{kate}]

dan kate akan bertahan. :)

Alternatif menggunakan screen/tmux/byobu, yang akan membuat Shell tetap berjalan, terlepas dari terminal.

50
gertvdijk

Anda dapat menjalankan proses seperti ini di terminal

setsid process

Ini akan menjalankan program dalam sesi baru. Seperti yang dijelaskan http://hanoo.org/index.php?article=run-program-in-new-session-linux

31
hanoo

Meskipun semua saran bekerja dengan baik, saya telah menemukan alternatif saya adalah menggunakan screen, sebuah program yang mengatur terminal virtual di layar Anda.

Anda mungkin mempertimbangkan untuk memulai dengan screen -S session_name. Layar dapat diinstal pada hampir semua turunan Linux dan Unix. Memukul Ctrl+A dan (huruf kecil) C akan memulai sesi kedua. Ini akan memungkinkan Anda untuk beralih antara sesi awal dengan menekan Ctrl+A dan  atau sesi yang lebih baru dengan menekan Ctrl+A dan 1. Anda dapat memiliki hingga sepuluh sesi dalam satu terminal. Saya biasa memulai sesi di tempat kerja, pulang, ssh ke mesin kerja saya, dan kemudian memanggil screen -d -R session_name. Ini akan menghubungkan Anda kembali ke sesi jarak jauh itu.

10
apolinsky

Saya lebih memilih:

(Nama aplikasi dan)

misalnya: [email protected]:~$ (chromium-browser &)

Pastikan untuk menggunakan tanda kurung saat mengetik perintah!

8
daGo

Saya punya skrip untuk:

  • Jalankan perintah sewenang-wenang di latar belakang

  • Hentikan mereka agar tidak terbunuh dengan jendela terminal

  • Menekan output mereka

  • Menangani status keluar

Saya menggunakannya terutama untuk gedit, evince, inkscape dll yang semuanya memiliki banyak keluaran terminal yang mengganggu. Jika perintah selesai sebelum TIMEOUT, status keluar Nohup dikembalikan bukan nol.

#!/bin/bash

TIMEOUT=0.1

#use Nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send Nohup's output to /dev/null, supressing Nohup.out
#run Nohup in the background so this script doesn't block
Nohup "${@}" >/dev/null 2>&1 &
Nohup_PID=$!

#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally

#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $Nohup_PID
Nohup_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $Nohup_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of Nohup, whatever it was
exit $Nohup_STATUS

contoh ...

>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail
7
jozxyqk

Cara Shell-satunya untuk melakukan semua ini adalah dengan menutup stdin dan latar belakang perintah:

command <&- & 

Maka itu tidak akan berhenti ketika Anda keluar dari Shell. Mengarahkan stdout adalah hal opsional yang menyenangkan untuk dilakukan.

Kerugiannya adalah Anda tidak bisa melakukan ini setelah faktanya.

7
w00t

Anda dapat mengatur proses (PID) untuk tidak menerima sinyal HUP saat keluar dan menutup sesi terminal. Gunakan perintah berikut:

Nohup -p PID
4
tony

Bisa dibilang mirip dengan jawaban yang ditawarkan oleh apolinsky , saya menggunakan varian pada screen. Perintah Vanilla seperti ini

screen bash -c 'long_running_command_here; echo; read -p "ALL DONE:"'

Sesi dapat diputus dengan Ctrl ACtrl D dan terhubung kembali dalam kasus sederhana dengan screen -r. Saya memiliki ini dibungkus dengan skrip yang disebut session yang hidup dalam PATH saya siap untuk akses mudah:

#!/bin/bash
#
if screen -ls | awk '$1 ~ /^[1-9][0-9]*\.'"$1"'/' >/dev/null
then
    echo "WARNING: session is already running (reattach with 'screen -r $1')" >&2
else
    exec screen -S "$1" bash -c "[email protected]; echo; echo '--------------------'; read -p 'ALL DONE (Enter to exit):'"
    echo "ERROR: 'screen' is not installed on this system" >&2
fi
exit 1

Ini hanya berfungsi ketika Anda tahu sebelumnya bahwa Anda ingin memutuskan suatu program. Itu tidak menyediakan program yang sudah berjalan untuk terputus.

3
roaima

Demikian pula dengan jawaban lain yang diposting sebelumnya, seseorang dapat mentransfer proses yang sedang berjalan untuk menggunakan "layar" secara retrospektif berkat reptyr dan kemudian menutup terminal. Langkah-langkahnya dijelaskan dalam pos ini . Langkah-langkah yang harus diambil adalah:

  1. Tangguhkan prosesnya
  2. Lanjutkan proses di latar belakang
  3. Abaikan prosesnya
  4. Luncurkan sesi layar
  5. Temukan PID dari proses tersebut
  6. Gunakan reptyr untuk mengambil alih proses
2
user308879