Saya sedang mengerjakan mesin Linux melalui SSH (Putty). Saya perlu membiarkan proses berjalan pada malam hari, jadi saya pikir saya bisa melakukan itu dengan memulai proses di latar belakang (dengan ampersand di akhir perintah) dan mengarahkan stdout ke file.
Yang mengejutkan saya, itu tidak berhasil. Segera setelah saya menutup jendela Putty, proses dihentikan.
Bagaimana saya bisa mencegah hal itu terjadi ??
linux
process
ssh
background-process
Mendapatkan gratis
sumber
sumber
nohup command > /dev/null 2>&1 &
untuk berjalan di latar belakang tanpa membuat stdout atau output stderr (tanpanohup.out
file)nohup
tidak membantu dalam hal ini. Apakah ada cara untuk biola denganCtrl+Z
/bg
?Saya akan merekomendasikan menggunakan Layar GNU . Ini memungkinkan Anda untuk memutuskan sambungan dari server sementara semua proses Anda terus berjalan. Saya tidak tahu bagaimana saya hidup tanpanya sebelum saya tahu itu ada.
sumber
Ketika sesi ditutup, proses menerima sinyal SIGHUP yang tampaknya tidak ditangkap. Anda dapat menggunakan
nohup
perintah saat meluncurkan proses atau perintah bash built-indisown -h
setelah memulai proses untuk mencegah hal ini terjadi:sumber
dasmon? bukan? LAYAR? (tmux ftw, layar adalah sampah ;-)
Lakukan saja apa yang telah dilakukan setiap aplikasi lain sejak awal - garpu ganda.
Bang! Selesai :-) Saya sudah menggunakan ini berkali-kali pada semua jenis aplikasi dan banyak mesin lama. Anda dapat menggabungkan dengan arahan ulang dan yang lainnya untuk membuka saluran pribadi antara Anda dan proses.
Buat sebagai coproc.sh:
lalu
Dan begitulah, menelurkan apa pun. <(:) membuka pipa anonim melalui proses substitusi, yang mati, tetapi pipa tetap ada karena Anda memiliki pegangan untuk itu. Saya biasanya melakukan
sleep 1
alih - alih:
karena itu sedikit bersemangat, dan saya akan mendapatkan kesalahan "file sibuk" - tidak pernah terjadi jika perintah nyata dijalankan (misalnya,command true
)"sumber heredoc":
Ini berfungsi pada setiap shell yang pernah saya coba, termasuk busybox / etc (initramfs). Saya belum pernah melihat itu dilakukan sebelumnya, saya secara mandiri menemukannya sambil mendorong, siapa tahu sumber bisa menerima argumen? Tetapi sering berfungsi sebagai bentuk eval yang jauh lebih mudah dikelola, jika ada hal seperti itu.
sumber
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)Ganti nama proses Anda dengan bla!
sumber
Secara pribadi, saya suka perintah 'batch'.
Ini memasukkannya ke latar belakang, dan kemudian mengirimkan hasilnya kepada Anda. Itu bagian dari cron.
sumber
Seperti yang telah dicatat oleh orang lain, untuk menjalankan proses di latar belakang sehingga Anda dapat memutuskan sambungan dari sesi SSH Anda, Anda harus memiliki proses latar belakang memisahkan diri dengan benar dari terminal pengendali - yang merupakan pseudo-tty yang digunakan sesi SSH.
Anda dapat menemukan informasi tentang proses daemonisasi dalam buku-buku seperti Stevens "Advanced Network Program, Vol 1, 3rd Edn" atau Rochkind "Advanced Unix Programming".
Saya baru-baru ini (dalam beberapa tahun terakhir) harus berurusan dengan program bandel yang tidak daemonisasi sendiri dengan benar. Saya akhirnya berurusan dengan itu dengan membuat program daemonisasi generik - mirip dengan nohup tetapi dengan lebih banyak kontrol yang tersedia.
Dash ganda adalah opsional pada sistem yang tidak menggunakan fungsi GNU getopt (); itu perlu (atau Anda harus menentukan POSIXLY_CORRECT di lingkungan) di Linux dll. Karena double-dash bekerja di mana-mana, yang terbaik adalah menggunakannya.
Anda masih dapat menghubungi saya (nama depan dot nama belakang di gmail dot com) jika Anda menginginkan sumbernya
daemonize
.Namun, kode tersebut sekarang (akhirnya) tersedia di GitHub dalam repositori SOQ (Stack Overflow Questions) saya sebagai file
daemonize-1.10.tgz
dalam sub-direktori paket .sumber
Pada sistem berbasis Debian (pada mesin jarak jauh) Instal:
Pemakaian:
Untuk mengganti nama sesi:
Untuk keluar dari sesi:
(ini meninggalkan sesi tmux). Kemudian, Anda dapat keluar dari SSH.
Ketika Anda perlu kembali / memeriksanya lagi, mulai SSH, dan masukkan
Ini akan membawa Anda kembali ke sesi tmux Anda.
sumber
Untuk sebagian besar proses, Anda dapat pseudo-daemonize menggunakan trik baris perintah Linux lama ini:
Sebagai contoh:
Kemudian mulai jendela terminal baru dan:
Akan menunjukkan bahwa
sleep 30
masih berjalan.Apa yang telah Anda lakukan adalah memulai proses sebagai anak dari seorang anak, dan ketika Anda keluar,
nohup
perintah yang biasanya akan memicu proses untuk keluar tidak mengalir turun ke cucu, meninggalkannya sebagai proses yatim piatu, masih berjalan .Saya lebih suka ini "mengatur dan lupakan saja" pendekatan, tidak perlu berurusan dengan
nohup
,screen
, tmux, I / o redirection, atau salah satu dari hal-hal itu.sumber
Jika Anda menggunakan layar untuk menjalankan proses sebagai root, waspadalah terhadap kemungkinan serangan elevasi privilege. Jika akun Anda sendiri entah bagaimana dikompromikan, akan ada cara langsung untuk mengambil alih seluruh server.
Jika proses ini perlu dijalankan secara teratur dan Anda memiliki akses yang cukup di server, opsi yang lebih baik adalah menggunakan cron menjalankan pekerjaan. Anda juga bisa menggunakan init.d (super daemon) untuk memulai proses Anda di latar belakang, dan itu dapat berakhir segera setelah selesai.
sumber
nohup
sangat bagus jika Anda ingin mencatat rincian Anda ke file. Tetapi ketika pergi ke latar belakang Anda tidak dapat memberikan kata sandi jika skrip Anda meminta. Saya pikir Anda harus mencobascreen
. ini adalah utilitas yang dapat Anda instal pada distribusi linux Anda menggunakan yum misalnya pada CentOSyum install screen
kemudian mengakses server Anda melalui dempul atau perangkat lunak lain, dalam jenis shell Andascreen
. Ini akan membuka layar [0] di dempul. Lakukan pekerjaanmu. Anda dapat membuat lebih banyak layar [1], layar [2], dll dalam sesi dempul yang sama.Perintah dasar yang perlu Anda ketahui:
Untuk memulai layar
layar
Untuk c layar berikutnya reate
ctrl + a + c
Untuk pindah ke layar n ext yang Anda buat
ctrl + a + n
Untuk d etach
ctrl + a + d
Selama bekerja tutup dempul Anda. Dan lain kali saat Anda masuk melalui tipe dempul
layar -r
Untuk menyambung kembali ke layar Anda, dan Anda dapat melihat proses Anda masih berjalan di layar. Dan untuk keluar dari layar ketik #exit.
Untuk lebih jelasnya lihat
man screen
.sumber
yum
adalah alat yang tepat, ketika Anda tidak tahu distro, itu tidak baik. Anda harus memperjelas distro mana yangscreen
dapat diinstalyum
.Nohup memungkinkan proses klien untuk tidak dibunuh jika proses induknya dimatikan, untuk argumen ketika Anda logout. Lebih baik lagi menggunakan:
Nohup membuat proses Anda mulai kebal terhadap pemutusan yang sesi SSH Anda dan proses anaknya terbunuh saat Anda logout. Perintah yang saya berikan memberi Anda cara Anda dapat menyimpan pid aplikasi dalam file pid sehingga Anda dapat membunuhnya dengan benar dan memungkinkan proses untuk berjalan setelah Anda logout.
sumber
Gunakan layar. Sangat mudah digunakan dan bekerja seperti vnc untuk terminal. http://www.bangmoney.org/presentations/screen.html
sumber
Jika Anda juga ingin menjalankan aplikasi X - gunakan xpra bersama "layar".
sumber
saya juga akan pergi untuk program layar (saya tahu bahwa jawaban orang lain adalah layar tetapi ini adalah penyelesaian)
tidak hanya fakta bahwa &, ctrl + z bg disown, nohup, dll. dapat memberi Anda kejutan buruk bahwa ketika Anda keluar dari pekerjaan, pekerjaan akan tetap terbunuh (saya tidak tahu mengapa, tapi itu terjadi pada saya, dan itu tidak mengganggu saya, dengan itu karena saya beralih menggunakan layar, tetapi saya kira solusi anthonyrisinger sebagai forking ganda akan menyelesaikannya), juga layar memiliki keuntungan besar hanya dengan back-grounding:
dan btw, ini adalah pertanyaan yang saya tidak akan pernah tanyakan di tempat pertama :) ... saya menggunakan layar dari awal saya melakukan apa pun di unix ... i (hampir) TIDAK PERNAH bekerja di shell unix / linux tanpa layar awal pertama ... dan saya harus berhenti sekarang, atau saya akan memulai presentasi tanpa akhir tentang apa layar yang baik dan apa yang bisa Anda lakukan untuk ya ... lihat sendiri, itu layak;)
sumber
&
(eksekusi tidak serempak) diperkenalkan oleh shell Thompson pada tahun 1971 , untuk versi pertama UNIX ... jadi secara harfiah "selalu" ,-) sayangnya, Saya terlalu konservatif - sebenarnya sudah 41 tahun.Ada juga perintah daemon dari paket libslack open-source.
daemon
cukup dapat dikonfigurasi dan peduli tentang semua hal daemon yang membosankan seperti restart otomatis, logging atau penanganan pidfile.sumber
Tambahkan string ini ke perintah Anda:> & - 2> & - <& - &. > & - Berarti tutup stdout. 2> & - berarti close stderr. <& - berarti stdin dekat. & Berarti berjalan di latar belakang. Ini berfungsi untuk memulai pekerjaan secara terprogram melalui ssh, juga:
sumber
Saya menggunakan perintah layar. Tautan ini memiliki detail tentang cara melakukan ini
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
sumber
Jawaban yang diterima menyarankan menggunakan nohup . Saya lebih suka menyarankan menggunakan PM2 . Menggunakan pm2 lebih dari nohup memiliki banyak keuntungan, seperti menjaga aplikasi tetap hidup, memelihara file log untuk aplikasi dan banyak lagi fitur lainnya. Untuk lebih detail lihat ini .
Untuk menginstal pm2 Anda harus mengunduh npm . Untuk sistem berbasis Debian
dan untuk Redhat
Atau Anda dapat mengikuti instruksi ini . Setelah menginstal npm, gunakan untuk menginstal pm2
Setelah selesai, Anda dapat memulai aplikasi dengan
Untuk pemantauan proses gunakan perintah berikut:
Kelola proses menggunakan nama aplikasi atau id proses atau kelola semua proses secara bersamaan:
File log dapat ditemukan di
File biner yang dapat dieksekusi juga dapat dijalankan menggunakan pm2. Anda harus membuat perubahan ke file jason. Ubah
"exec_interpreter" : "node"
, untuk"exec_interpreter" : "none".
(lihat bagian atribut ).Kompilasi kode di atas
dan jalankan dengan np2 di latar belakang
sumber
Di systemd / Linux, systemd-run adalah alat yang bagus untuk meluncurkan proses sesi-independen. Pembenci akan selalu membenci
sumber