Bagaimana cara menjalankan perintah di layar dan melepaskan?

75

Bagaimana saya bisa mendapatkan layar untuk menjalankan perintah dan kemudian melepaskan (Yaitu, secara otomatis dalam satu skrip tanpa input lebih lanjut di luar memulai skrip)? misalnya saya menjalankan myscript.sh dan secara otomatis memulai sesi layar, mengeksekusi perintah, kemudian melepaskan.

darkfeline
sumber

Jawaban:

114

Ini mudah:

screen -d -m yourcommand
Alan Curry
sumber
4
tidak ada dadu. layar -d -m perintah, layar -list mengatakan tidak ada soket, layar -r tidak ada sesi
darkfeline
1
Entah bagaimana perintah Anda tidak ditemukan, atau tidak berfungsi dengan benar di lingkungan layar yang dibuat secara otomatis. Coba lakukan saja screen yourcommandtanpa -ddan -mdan lihat bagaimana hasilnya dulu.
Alan Curry
Anda benar. Layar berakhir ketika perintah selesai, bertentangan dengan harapan saya. Tetapi jawaban Anda berhasil.
darkfeline
3
Anda dapat mengubahnya dengan mengaktifkan zombieopsi di layar. Masukan zombie xydalam Anda ~/.screenrc. Seharusnya juga dimungkinkan untuk mengaktifkannya hanya untuk satu sesi, meletakkan zombie xyfile lain dan menggunakan -c filetetapi untuk beberapa alasan itu tidak berfungsi ketika saya mencobanya. Atau cukup gunakansh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry
@AlanCurry, Tidak, ini juga tidak berfungsi untuk saya, meskipun perintahnya berjalan dengan sempurna (dan membutuhkan beberapa jam) ketika dijalankan di layar secara manual.
Cerin
47

Untuk menjalankan satu perintah di layar dan melepaskan, Anda dapat mencoba:

screen -dm sleep 10

Untuk menjalankan banyak perintah, cobalah:

screen -dm bash -c "sleep 10; myscript.sh"

Harap dicatat bahwa ketika sebuah program berakhir, layar (per default) membunuh jendela yang berisi itu.

Jika Anda tidak ingin sesi Anda terbunuh setelah skrip selesai, tambahkan exec shdi akhir, misalnya:

screen -dm bash -c 'sleep 5; exec sh'

Untuk membuat daftar semua sesi Anda, cobalah:

screen -list

Terkait: Mulai layar Unix, Jalankan perintah, Lepaskan .

kenorb
sumber
2
Ini bekerja untuk saya di Ubuntu 16.04. Selain nama sesi Anda sehingga Anda dapat kembali ke sini kelak, tambahkan -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu
16

Untuk memulai sesi baru di latar belakang dengan nama 'mengantuk'

screen -S sleepy -dm sleep 60

Untuk membunuh sesi 'mengantuk'

screen -S sleepy -X quit      
Michal Zmuda
sumber
mengapa itu tidak berfungsi screen -S sleepy -dm "cd myfolder;sleep 60"?
Toolkit
@Toolkit Masalahnya adalah Anda memiliki perintah dalam tanda kutip sehingga diperlakukan sebagai satu perintah besar. Jelas kita tidak bisa mengeluarkannya dari tanda kutip karena titik koma. Untuk mengatasi ini, jalankan perintah seperti ini: layar -S mengantuk -dm bash -c "cd myfolder; sleep 60"
Jason Thompson
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
sumber
0

itu terjadi pada saya ketika saya menekan control c (sig int) untuk keluar dari program saya. keluar dari semua bash. jadi saya menemukan ini untuk menangkap SIGINT. dan mencegah keluar dari bash terakhir. (perlu mengetik keluar untuk keluar)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Saya merasa berguna untuk menggunakan cron untuk menjalankan program nodejs saat startup. dan untuk menjalankan layar saat boot. di cron ada sintaks acara acara khusus @reboot

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Shimon Doodkin
sumber