Buat layar dan jalankan perintah tanpa melampirkan

29

Saya sedang mengerjakan mengotomatiskan rutinitas perawatan yang melibatkan memulai dan menghentikan skrip yang berjalan dalam sesi layar. Pendekatan saya adalah untuk mematikan sesi layar, dan kemudian restart dan jalankan perintah dari dalam skrip menggunakan kemampuan untuk membuat layar dan meneruskan perintah tanpa harus melampirkan ke layar.

Namun, saya mengalami kesulitan dengan ini. Saya dapat membuat layar dengan benar tanpa harus menggunakan screen -d -m -S screen_name. Namun, jika saya menjalankan perintah berdasarkan:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

dengan echo -ne '\ 015' dibungkus dengan backticks daripada tanda kutip tunggal. Ini untuk mensimulasikan pengguna menekan tombol enter ketika perintah yang saya gunakan pindah ke direktori dan menjalankan skrip yang terletak di sana. Perintah ini berfungsi, tetapi hanya jika layar telah dilampirkan setelah dibuat. Ketika saya mencoba untuk mengotomatiskan proses membuat layar dan menjalankan perintah di dalamnya, saya ingin menghindari melampirkan dan melepaskan dalam skrip. Saya akan mencoba saran untuk membuat skrip shell yang berisi perintah yang perlu saya jalankan di dalam layar dan mengedit sesuai dengan hasil saya.

Apakah ada cara untuk membuat layar dan menjalankan perintah di dalam layar baik dalam satu perintah, atau tanpa harus melampirkan ke layar setelah membuat tetapi sebelum pelaksanaan perintah?

Terima kasih sebelumnya.

** Pembaruan - setelah mencoba saran untuk menempatkan perintah yang saya perlu jalankan dalam skrip shell, saya telah berhasil membuat layar dan menjalankan perintah dari dalam layar, tetapi saya mendapatkan perilaku bahwa ketika skrip berhenti berjalan layar ditutup juga. Ini seharusnya tidak menjadi masalah karena skrip adalah skrip logging yang hanya boleh berhenti dengan sepengetahuan admin sys atau melalui skrip yang saya coba kembangkan, namun akan lebih baik untuk memiliki pengaturan layar sedemikian rupa sehingga layar tidak hilang jika skrip dihentikan. Apakah mungkin untuk mencapai perilaku ini? **

coffeecoder
sumber
1
Saya mengalami masalah yang sama dan menemukan solusi di superuser.com untuk siapa pun yang menemukan masalah ini superuser.com/questions/342463/…
Dan Herbert
Untuk menjaga layar tetap terbuka Anda bisa menggunakan sesuatu seperti: screen bash -c 'echo "test"; / bin / bash '
gwyn
1
Untuk masalah penutupan otomatis, Anda bisa menggunakan spesial .screenrcyang berisi baris zombie kr, yang akan membuat jendela jadi terbuka, dan Anda bisa menekan kuntuk menutup winodw, atau runtuk menjalankan perintah di jendela lagi. Saya memiliki ini untuk .screenrc default saya.
Martin C.

Jawaban:

18

Saya pikir Anda mungkin mengalami beberapa masalah.

Jika perintah selesai sebelum Anda memasang kembali, layar akan hilang. Anda dapat memperagakan ini dengan menggunakan:

screen -d -m ls -l

Ini akan menjalankan ls -lperintah, tetapi screen -listtidak akan menampilkannya karena proses layar telah berakhir.

Saya juga tidak tahu apa yang Anda coba lakukan dengan barang-barang ini. Mungkin memperbarui pertanyaan Anda akan membantu, karena apa yang saya pikir Anda coba lakukan adalah menjalankan beberapa perintah dalam sesi layar. Ini harus sesederhana:

screen -d -m bash -c "command1 ; command2 ; command3"

Jika ini banyak digunakan, mungkin Anda harus membuat skrip shell yang menjalankan hanya perintah ini, kemudian gunakan yang lebih sederhana:

screen -d -m /path/to/script.sh
Michael Graff
sumber
apakah ada cara untuk mendapatkan perilaku serupa tanpa layar langsung lepas? Katakan saya ingin memulai sesi ssh dan kemudian lepaskan segera setelah; screen -d -m sshakan melepaskan pada kata sandi prompt sebelum sesi dibuat.
Bintang terang
Ini tidak berhasil untuk saya. Mengganti hte "commandN" dengan beberapa program yang sudah berjalan lama tidak menghasilkan apa-apa screen -list. Juga, ini tidak memberi nama layar seperti yang coba dilakukan OP.
Cerin
Saya sedang mencari untuk menjalankan program python menggunakan metode ini. Saya mencoba membuat skrip sh untuk menjalankannya, tetapi tidak melihat layar dalam daftar. Sebagai gantinya saya menggunakan screen -d -m python EventGenerator.py, yang bekerja dengan baik
Dan Ciborowski - MSFT
1
Itu mungkin seharusnya bash -c "commands"bukanbash "commands"
marcovtwout
Anda benar, harus ada -c.
Xdg
9

Mulai layar terpisah

screen -dmS <screen name>

Jalankan perintah di layar terpisah yang dibuat sebelumnya

screen -S <screen name> -X stuff '<CMD>\n'

Ya, Anda perlu mengetikkan simbol enter untuk mengirimkan perintah atau kalau tidak, itu hanya akan menambahkan string ke layar.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html

Yogesh
sumber
1
apa itu 'barang'?
Nadav B
stuffsebenarnya adalah perintah yang menyalin-menempelkan perintah lain ke dalam sesi layar: stuff [string] Stuff string string dalam buffer input dari jendela saat ini. Ini seperti perintah "tempel" tetapi dengan overhead yang lebih sedikit. Tanpa parameter, layar akan meminta string untuk diisi. Anda tidak dapat menempelkan buffer besar dengan perintah "stuff". Ini paling berguna untuk binding utama. Lihat juga "bindkey". [dikutip dari theterminallife.com/sending-commands-into-a-screen-session/]
alisa
2

Saya pernah mengalami masalah ini sebelumnya, itu adalah bug dengan implementasi cygwin.

Apa yang saya lakukan adalah membuat ".screenrc_detaching" hanya memiliki perintah berikut

#detach
detach 

dan kemudian mulai layar dengan

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Kemudian Anda memiliki sesi layar Anda dan sudah terpasang dan terlepas dan Anda baik untuk memompa perintah ke sana.

Mudah ! : P

PiersyP
sumber
2

Ini berhasil bagi saya, tanpa -ctidak berhasil

screen -d -m bash -c "command1; command2; command3"

Mazilu88
sumber
1

Cara copy'npaste untuk menguji jawaban sebelumnya adalah:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Hasil yang diharapkan harus serupa dengan:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Itu berarti tidak ada sesi layar yang sebelumnya dibuat)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Ini waktu yang dihabiskan untuk membuat layar dan melepaskannya. Hampir seketika.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Output ini menampilkan sesi layar yang tersedia. Dibuat atas perintah terakhir.)

sleep 20; cat /tmp/h

(Ini catmenunjukkan nama host dijalankan di dalam layar gnu)

Enrique S. Filiage
sumber
dan apa hasil dari tes semacam itu?
Pierre.Vriens
Anda benar, tidak ada contoh. Saya akan menambahkan.
Enrique S. Filiage
jauh lebih baik! merci! +1
Pierre.Vriens
0
screen -S test -d -m -- sh -c 'ls; exec $SHELL'
Nadav B
sumber