Saya memiliki proses server yang sudah berjalan lama di dalam sesi layar di server Linux saya. Agak tidak stabil (dan sayangnya bukan perangkat lunak saya jadi saya tidak bisa memperbaikinya!), Jadi saya ingin membuat skrip proses restart setiap malam untuk membantu stabilitas. Satu-satunya cara untuk membuatnya melakukan shutdown yang anggun adalah dengan masuk ke proses layar, beralih ke jendela yang sedang berjalan, dan masukkan string "berhenti" pada konsol kontrolnya.
Apakah ada contortions pengalihan cerdas yang bisa saya lakukan untuk membuat cronjob mengirim perintah berhenti itu pada waktu yang tetap setiap hari?
ls -l /proc/7417/fd/0
./dev/pts/19
),y
Karakter tidak mencapai aplikasi itu sendiri. Ini mirip dengan apa yang terjadi ketika Anda menggunakan perintah write (1) . Bagaimanapun, cobalah jawaban saya yang lain atau alat otomatisasi grafis seperti xdotool .Solusi berbasis layar
Mulai server seperti ini:
layar akan mulai dalam mode terpisah, jadi jika Anda ingin melihat apa yang terjadi, jalankan:
Kontrol server seperti ini:
(jawaban ini didasarkan pada pengiriman input teks ke layar terpisah dari situs saudara Unix & Linux )
Penjelasan parameter:
solusi berbasis tmux
Mulai server seperti ini:
tmux akan mulai dalam mode terpisah, jadi jika Anda ingin melihat apa yang terjadi, jalankan:
Kontrol server seperti ini:
Penjelasan parameter:
sumber
Coba ini untuk memulai:
Dan ini untuk membunuh:
sumber
echo "xxx" > cmd
akan berhenti (karena pipa akan ditutup). Meskipun beberapa program cukup pintar untuk membuka kembali (rewind(3)
) stdin mereka ketika mereka menghadapi EOF.Dimungkinkan untuk mengirim teks input ke proses yang berjalan tanpa menjalankan
screen
utilitas, atau utilitas mewah lainnya. Dan itu bisa dilakukan dengan mengirimkan teks input ini ke proses 'standard input "file"/proc/PID#/fd/0
.Namun, teks input perlu dikirim dengan cara khusus untuk dibaca oleh proses. Mengirim teks input melalui
write
metode file biasa tidak akan menyebabkan proses untuk menerima teks. Ini karena hal itu hanya akan menambah "file" itu, tetapi tidak akan memicu proses untuk membaca byte.Untuk memicu proses membaca byte, perlu dilakukan
IOCTL
operasi tipeTIOCSTI
untuk setiap byte tunggal yang akan dikirim. Ini akan menempatkan byte ke dalam antrian masukan standar proses.Ini dibahas di sini dengan beberapa contoh dalam C, Perl, dan Python:
https://unix.stackexchange.com/questions/48103/construct-a-command-by-putting-a-string-into-a-tty/48221
-
Jadi untuk menjawab pertanyaan awal yang diajukan hampir 9 tahun yang lalu, tugas cron perlu menjalankan beberapa skrip / program utilitas kecil yang mirip dengan contoh yang ditulis orang untuk pertanyaan lain itu, yang akan mengirim string "stop \ n" ke proses server itu dalam pertanyaan, dengan mengirim masing-masing 5 byte melalui
IOCTL
operasi ketikTIOCSTI
.Tentu saja ini hanya akan bekerja pada sistem yang mendukung
TIOCSTI
IOCTL
jenis operasi (seperti Linux), dan hanya dariroot
akun pengguna, karena "file" di bawah/proc/
ini "dimiliki" olehroot
.sumber
Seandainya itu membantu siapa pun:
Saya punya masalah yang sama, dan karena proses yang saya gunakan tidak di bawah
screen
atautmux
, saya harus mengambil pendekatan yang berbeda.Aku melekat
SUNTINGgdb
padaxterm
proses saya berjalan di, dan digunakancall write(5, "stop\n", 5)
darigdb
menulis ke deskriptor menguasai pty berkas.Saya menemukan deskriptor file yang akan dikirimi data dengan mencari
/proc/<pid>/fd
tautan/dev/ptmx
dan kemudian coba-coba antara dua opsi (mengirim string saya ke kedua deskriptor file yang cocok sepertinya tidak menimbulkan bahaya).Ternyata
AKHIR EDITxterm
proses yang saya lampirkan terpelajar denganspawn-new-terminal()
xterm
aksi dari keybinding, danptmx
deskriptor file kedua terbuka hanyalah prosesptmx
indukxterm
yang belum ditutup.Karenanya panggilan percobaan dan kesalahan telah mengirim output ke terminal lain itu.
Sebagian besar
xterm
proses tidak memiliki duaptmx
penjelas file.Ini secara efektif mengetik string itu ke terminal, dan karenanya mengirimkannya ke proses yang berjalan di bawahnya.
nb Anda mungkin perlu mengizinkan melampirkan ke proses yang berjalan dengan sesuatu seperti
sudo bash -c "echo 0 > /proc/sys/kernel/yama/ptrace_scope"
sumber
Karena saya tidak dapat mengomentari jawaban yang paling diterima dari Cristian Ciupitu (2010), saya harus memasukkan ini dalam jawaban yang terpisah:
Pertanyaan ini telah dipecahkan di utas ini: https://stackoverflow.com/questions/5374255/how-to-write-data-to-existing-processs-stdin-from-external-process
Pendeknya:
Anda harus memulai proses Anda dengan pipa untuk stdin yang tidak memblokir atau menutup ketika input saat ini ditulis. Ini dapat diimplementasikan oleh loop tak berujung sederhana yang akan disalurkan ke proses yang dimaksud:
Saya dapat mengkonfirmasi bahwa ini berbeda dari cara krissi untuk membuka pipa yang tidak berfungsi dalam kasus saya. Solusi yang ditampilkan malah bekerja.
Anda kemudian dapat menulis ke file ... / fd / 0 dari proses untuk mengirim instruksi kepadanya. Satu-satunya kelemahan adalah bahwa Anda perlu menghentikan proses bash juga yang menjalankan loop tak berujung setelah server dimatikan.
sumber