Cari tahu perintah mana yang sedang berjalan dalam sesi layar

10

Saya sering membiarkan tugas berjalan di dalam layar sehingga saya bisa memeriksanya nanti, tetapi kadang-kadang saya perlu memeriksa perintah mana yang berjalan di dalam layar. Biasanya berupa skrip php, seperti

screen -d -m nice -n -10 php -f convertThread.php start=10000

Saya tidak merekam layar mana yang menjalankan perintah mana, tetapi saya ingin bisa merasakan kemajuan yang dibuat dengan memeriksa perintah apa yang dijalankan di dalamnya, tanpa mematikan proses.

Saya tidak melihat opsi untuk ini di dalam halaman bantuan layar.

Austin Burk
sumber

Jawaban:

18

Saya baru-baru ini harus melakukan ini. Pada Stack Overflow saya menjawab bagaimana menemukan PID dari proses yang berjalan di layar . Setelah Anda memiliki PID yang dapat Anda gunakan psuntuk mendapatkan perintah. Berikut adalah isi dari jawaban itu dengan beberapa konten tambahan untuk mengatasi situasi Anda:

Anda bisa mendapatkan PID dari sesi layar di sini seperti:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

Biarkan kami mengira bahwa Anda ingin PID program berjalan di Bash di foo_Monitorsesi layar. Gunakan PID foo_Monitorsesi layar untuk menjalankan PID bashsesi di dalamnya dengan mencari PPID (PID Induk) untuk PID yang diketahui:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

Sekarang dapatkan PID bashsesi saja:

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

Sekarang kita ingin proses dengan yang PID. Hanya bersarang perintah, dan kali ini gunakan -vbendera grep bashuntuk mendapatkan proses yang bukan bash:

$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

Kita dapat menggunakan PID itu untuk menemukan perintah (Lihat di akhir baris kedua):

$ ps u -p 23869
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ?     Sl   Feb02 1147:09 /usr/lib/foo

Gabungkan semuanya:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
dotancohen
sumber
Oh, pintar! Saya suka itu! Karena ini menjawab pertanyaan secara langsung, saya akan menerima jawaban ini. Saya menghargainya! Sorry @Ghanima (: '
Austin Burk
7

Bagaimana dengan menggunakan screen -S <your-fancy-name>untuk memberikan sesi yang berarti nama sesi sesuai dengan perintah yang mereka jalankan? Nama akan didaftar dengan screen -lsdan digunakan untuk melanjutkan sesi oleh screen -r <your-fancy-name>.

Edit untuk ditambahkan:

Karena itu telah dibawa ke perhatian saya beberapa hari yang lalu. tmuxmenawarkan serangkaian fungsi yang sama persis screen(jika tidak lebih) dan dilengkapi dengan fitur yang sesuai dengan kebutuhan Anda. Dari FAQ: "tmux mendukung penggantian nama jendela secara otomatis ke aplikasi yang sedang berjalan tanpa retasan kotor menggunakan urutan pelarian. Bahkan secara default diaktifkan."

Ghanima
sumber