Bagaimana cara mengeksekusi kode dalam sesi tmux baru - dari dalam sesi saat ini?

13

Saya menggunakan Ubuntu 16.04 dan saya membutuhkan tmuxsolusi berikut karena saya ingin menjalankan proses timeout dengan sleepseperti pada kasus khusus saya, saya tidak puas atdan menemukan bug dengan nohup(ketika menggabungkan nohup-sleep). Sekarang, tmuxtampaknya sebagai alternatif terbaik karena memiliki mekanisme no-hangup sendiri dan sebenarnya berfungsi dengan baik dalam penggunaan manual (saya mengajukan pertanyaan hanya dalam hal mengotomatiskan proses yang sudah dapat saya lakukan secara manual dengannya).

Apa yang saya butuhkan:

Saya perlu cara untuk melakukan 3 tindakan berikut, semuanya dalam satu operasi:

  1. Melampirkan tmuxsesi baru .
  2. Menyuntikkan seperangkat perintah siap ke sesi itu, seperti (sleep 30m ; rm -rf dir_name ; exit) . Saya lebih suka set multi-line, dan bukan satu baris panjang.
  3. Menjalankan perintah di atas mengatur saat itu selesai ditulis sebagai stdin di tmuxsesi baru .

Dengan kata lain, saya ingin mengeksekusi kode yang diatur dalam tmuxsesi lain yang dibuat khusus untuk tujuan itu, tetapi untuk melakukan semuanya dalam satu operasi.


Catatan:

  • Saya bertujuan untuk melakukan semua dari sesi kerja asli saya (sesi yang paling sering saya kerjakan). Secara umum, saya tidak punya niat untuk mengunjungi sesi yang baru dibuat, saya hanya ingin membuatnya dengan kode yang dieksekusi secara otomatis dan hanya itu.

  • Jika memungkinkan, saya lebih suka solusi heredoc. Saya pikir ini paling efisien.

JohnDoea
sumber

Jawaban:

18

Jika Anda memasukkan kode yang ingin Anda jalankan misalnya /opt/my_script.sh, sangat mudah untuk melakukan apa yang Anda inginkan:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Ini memulai sesi terpisah baru, bernama "myTempSession", mengeksekusi skrip Anda. Anda nanti dapat melampirkannya untuk memeriksa apa yang dilakukannya, dengan mengeksekusi tmux attach-session -t myTempSession.

Bahwa menurut saya solusi yang paling mudah dan elegan. Saya tidak mengetahui adanya cara mudah menjalankan perintah dari stdin (baca "dari heredocs") dengan tmux. Dengan meretas di sekitar Anda bahkan mungkin dapat melakukannya, tetapi itu akan tetap (dan terlihat seperti) peretasan.

Sebagai contoh, inilah hack yang menggunakan perintah yang saya sarankan di atas untuk mensimulasikan perilaku yang Anda inginkan (= mengeksekusi kode dalam sesi tmux baru dari heredoc. Tidak ada penulisan terjadi pada hard drive server, karena file sementara dibuat /dev/shm, yang merupakan a tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF
Mario Vitale
sumber
1
Mario terkasih. Selalu senang membaca jawaban Anda. Saya tidak yakin apakah saya mengerti benar, tolong beritahu saya jika saya salah: 1.Ada dua cara untuk melakukannya, yang pertama melibatkan membuat skrip sementara (yang berisi kode) dan menjalankannya dengan penciptaan dan yang kedua adalah heredoc cara. 2.Jika cara kedua berfungsi (ketika setiap baris gema berisi setiap baris kode heredoc) mengapa kita harus melihat ini sebagai peretasan jika itu adalah kode Bash yang valid? Mungkin karena barisan heredoc digaungkan dan tidak dieksekusi secara teratur di heredoc?
JohnDoea
2
@Benia Ini adalah peretasan karena hanya bekerja pada beberapa sistem Unix yang memilikinya /dev/shm. Ini juga merupakan peretasan karena lebih rumit, sulit dibaca, dipahami dan dipelihara daripada sekadar menulis skrip ke file biasa dan memulainya dengan tmux.
Kusalananda
1
Seperti yang dijelaskan oleh @Kusalananda, heredocs untuk eksekusi kode adalah praktik buruk pada umumnya. Meskipun jelek dan tidak dapat dipastikan, ia bekerja, tetapi memaksa Anda untuk menemukan cara bundaran dalam melakukan hal-hal yang sangat sederhana ... bandingkan saja blok kode pertama dan kedua dalam jawabannya: dapatkah Anda mengetahui cara kerjanya? Berapa lama Anda melakukan itu? Ini bahkan lebih merupakan peretasan karena tmux tidak memiliki cara untuk mengeksekusi perintah dari stdin (kecuali untuk cara yang lebih banyak peretasannya sehingga saya tidak akan menganggapnya jelek), jadi skrip eksternal adalah satu - satunya (jawaban untuk 1.pertanyaan Anda) cara .
Mario Vitale
1
Maaf, ada kesalahan dalam sampel pertama (perintah "sesi baru" tidak tersirat jika Anda menggunakan argumen). Sekarang sudah diperbaiki.
Mario Vitale
1
Sekarang ketika saya menjalankannya tmux new-session -d -s "myTempSession" /opt/my_script.shtidak membuka file sementara bagi saya untuk menempelkan kode ... Yang saya butuhkan adalah membuka skrip langsung dari sesi saat ini, atau setidaknya sesuatu untuk pindah ke sesi baru dan kemudian langsung kembali ke sesi Sekarang. BTW Saya berencana untuk memberikan hadiah untuk semua bantuan Anda karena ini adalah yang paling bisa saya lakukan untuk mengucapkan terima kasih dan saya bisa memberikan hadiah dalam 11 jam.
JohnDoea