Saya mencoba untuk memaksa layar GNU untuk membuat terminal "virtual", tanpa melampirkannya, jalankan skrip di dalamnya dan TIDAK mengakhiri sesi begitu skrip berakhir.
Saya mencoba banyak kombinasi, termasuk:
screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh
atau
screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh
dan tidak ada yang bekerja. Saya mendapatkan sesi tanpa skrip dieksekusi, skrip dieksekusi, tetapi sesi dihentikan setelah selesai atau saya mendapatkan kesalahan "Tidak ada sesi layar ditemukan".
Apa yang saya coba pada dasarnya adalah menjalankan pendengar UDP, ditulis dalam PHP dan membuatnya bekerja dalam infinte loop (jangan putus mendengarkan). Ya - Saya bisa menjalankan skrip PHP &
di akhir, memaksa PHP CLI dijalankan sebagai daemon. Masalahnya adalah, bahwa saya menggunakan sepotong sampah yang disebut server (QNAP - tidak pernah membeli sampah ini!) Yang sepertinya mengabaikan ini. Segera setelah saya keluar dari sesi SSH, skrip berhenti.
Jadi screen
sepertinya menjadi satu-satunya pilihan. Tapi saya tidak mengerti, mengapa ini mengakhiri sesi setelah dieksekusi perintah atau skrip berakhir?
EDIT : Saya juga mencoba contoh yang ditemukan di Internet:
screen -dmS name
screen -S name -p windowname -X stuff 'mc
'
Tidak ada kekurangan! Setelah melampirkannya ( screen -R name
) Saya melihat bahwa Komandan Tengah Malam belum dieksekusi. Meskipun contoh penulis katakan, itu akan menjadi.
sumber
screen
, Anda hanya membuat satu jendela untuk menjalankan satu perintah. Ketika perintah keluar, jendela ditutup danscreen
tidak ada lagi yang harus dilakukan, jadi itu keluar.screen
dari penutupan? BTW: Saya masih belum mengerti! Jika saya meneleponscreen -dmS name
, saya membuat jendela terpisah, yang juga tidak ada hubungannya. Tetapi itu tidak ditutup secara otomatis! Tetapi ketika saya ingin mengeksekusi sesuatu di layar terpisah itu, itu berakhir setelah eksekusi dilakukan. Mengapa? Saya tidak melihat logika di sini. Dapat membuat jendela tidak melakukan apa-apa, tetapi tidak bisa membuat jendela melakukan sesuatu dan kemudian tidak melakukan apa-apa?&
di akhir), karena server buggy (QNAP), mereka dihentikan ketika sesi berakhir (saya diberitahu, mereka seharusnya tidak di Linux normal, jika dieksekusi dengan&
). Jadi saya tidak ingin melakukan apa pun setelahstart_udp_listeners.sh
selesai, hanya bagaimana mencegah sesi tidak diakhiri. Selama tidak, pendengar PHP saya berfungsi dengan baik.Jawaban:
Agar layar tetap sibuk setelah skrip selesai, biarkan terus-menerus sesuatu berjalan di jendela. Pilihan paling sederhana untuk "sesuatu" itu mungkin adalah shell interaktif. Inilah salah satu cara untuk melakukannya (dengan asumsi
bash
sebagai pilihan shell interaktif):-dm
: mulai layar dalam mode terpisah-S
: setel nama sesi untuk layar untuk pengambilan yang lebih mudah nantish -c '...'
: alih-alih hanya menjalankan skrip Anda, yang akan berakhir, gunakansh -c
untuk menjalankan beberapa perintahexec bash
: setelah skrip berakhir,sh
dari atas akan beralih ke shell interaktif (bash
), yang seharusnya tidak pernah keluar sampai sesuatu eksternal berakhir. Ini akan tetapscreen
terbuka selamabash
instance masih hidup.sumber
export IGNOREEOF=1
untuk mencegah pemutusan hubungan kerja dengan Ctrl + D seharusnya memberi saya solusi yang sempurna, saya sudah mencari sepanjang malam. TERIMA KASIH! :]bash -c
meskipun.screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
Saya tidak beruntung dengan
sh -c
raspberry pi 2 saya menjalankan Debian 7.8. Tetapibash -c
berhasil:Perintah:
sumber
bash
dansh
tampaknya dua kerang yang berbeda. Itu saja, saya pikir, tapi saya mungkin salah, karena saya pemula di Linux sama sekali.sh -c
untukbash -c
melakukan triknya. Saya tidak mengerti mengapa, baiksh
danbash
dipasang, jadi aku masih kehilangan tidur di atasnya, tapi setidaknya itu bekerja.sh
mungkin menunjuk ke/bin/dash
bukan/bin/bash
. Debian mengganti shell default daribash
kedash
beberapa tahun yang lalu.