Systemd'den tmux kullanırken "iç içe oturumlar" uyarısından kaçınma


1

2 seans, bir daemon seansı ve bir kullanıcı seansı başlatmak için tek bir komut dosyası kullanmak istiyorum. Herhangi bir kullanıcı oturum açmadan komut dosyasının açılışta başlamasını istiyorum.

Oluşturduğum komut dosyası doğrudan başlatıldığında çalışır, ancak yalnızca kısmen root olarak systemctl start daemon.service (boot'da olduğu gibi) ile başlatıldığında çalışır.

Esasen script bunu yapar:

# Clean up any old tmux sessions
tmux kill-session -t daemon > /dev/null 2>&1 
tmux kill-session -t user > /dev/null 2>&1 
rm -rf /tmp/tmux-`id -u`

tmux new-session -d -s daemon
tmux send-keys "$DAEMON" C-m

# Start the main tmux session from which we'll create 
#  all window panes 
export TMUX=
export TERM=xterm
tmux new-session -d -s user
tmux list-sessions >> $LOG

# Various window setup using "tmux split-window -h" 
#  or "tmux split-window -v" - no other args

# Window panes created. Now wait for daemon process to open socket, then
echo "Daemon is now listening." >> $LOG

tmux send-keys -t 1 "$CMD1" C-m
echo "Sent $CMD1 to pane 1" >> $LOG
tmux send-keys -t 1 "$CMD2" C-m
echo "Sent $CMD2 to pane 2" >> $LOG
...

# Spin in a loop until the daemon process stops listening, then exit

Bu kadar. Basit. İç içe geçmiş oturumlar yok, ancak tmux uyardı. Niye ya? TERM’i ayarlamak ve TMUX env değişkenlerini ayarlamaktan başka bir şey okudum, çünkü tmux’un kullanabileceği bir sistem olmadığından bir sistem süreci için gerekli. Yardımcı oldum, o yüzden çok fazla deneme yaptım size hiçbir ayrıntı veremedi.

Belirti her iki oturumun başlaması, arka plan programı normal görünüyor, ancak kullanıcı oturum bölmeleri boş, ancak tüm bölmeler doğru oluşturuldu. Gönderme tuşları kendilerine gönderilmemiş gibi görünüyor, günlük mükemmel görünüyor, hiçbir yere takılmıyor.

Bunun için tmux'un 1.9 ile 2.1 arasında değişen farklı sürümlerinde çalışması gerekiyor (ubuntu 16.04 ve Debian 8.7 & 8.8). Kullanıcı kısmı, daemon günlüğünü görüntülemek için "daha az" bir çağrı cihazı başlatır ve bir kullanıcı ile etkileşime girebilen 2 işlem yapar. .Profile dosyama bir "tmux attach-session -t kullanıcısı" koydum, böylece giriş yaptığımda tüm pencereleri görebiliyorum ve onlarla etkileşime geçebiliyorum. Hiçbir kullanıcının mevcut olmasa bile, kullanıcının işlemlerinin daemon ile başlaması önemlidir.

Neden tmux’un oturumların iç içe olduğunu düşündüğünü anlamıyorum, sadece b / c 2 de aynı komut dosyasından başlıyor. Betik bir şey çıktığında ve systemd her şeyi yeniden başlatmak için betiği tekrar arayacaktır. Sınama için # Restart = on-fail yorumlanmamıştır.

Gönderme tuşlarının ps'ye bakılarak çalıştırıldığını görebiliyorum, hepsi çalışıyor. Bence TMUX & TERM env vars, problemin anahtarını oluşturuyor, ancak bunun nasıl çözüleceğinden emin değilim, bu yüzden A) tmux, oturumları ayırır ve B) hiçbir kullanıcı ile başlamadan veya açık terminal tty'lerinden başlamaz.

Yanıtlar:


0

Bu oldukça tavşan deliğiydi ve çözülmesi gereken çok şey kazıyordu. IMO, sistem / işletim sistemi uygulayıcılarının çözecek birkaç öğesi var. Ubuntu'dan emin değilim, ancak Debian 8.8'in kesinlikle biraz dikkat etmesi gerekiyor.

Burada vereceğim bilgiyle, çalışan bir kurulum almak zor olmamalı. Ancak, tmux'un neden kafam karıştığına ve yukarıdaki "iç içe" bir oturumu düşündüğüne dair özel bir cevabım YOK DEĞİLDİR.

Bu sorun, bir daemon sürecinin başlangıcını ve önyükleme zamanında tmux komut dosyasını otomatikleştirmeye çalışırken ortaya çıktı. Hepsini yapmak için tek bir komut dosyası kullanmaya çalıştım ve sonra bu tmux "çoklu oturum" sorunu ortaya çıktı.

Nihai çözümüm, servistin ve tmux pencerelerinin başlangıcını, her ikisi de sistemli otomatikleştirilmiş 2 ayrı işleme ayırmaktı. Daemon'u başlatmak için bir "system" systemd birimi ve tmux betiğini başlatmak için "oturum" birimini kullanmayı seçtim. Her ne kadar daemon ve tmux scriptlerini kullanıcı oturumu systemd birimlerine koymayı denemesem de, bunun sorunsuz bir şekilde yapılabileceğine inanıyorum. Buraya girmeyeceğim ayrılığın avantajları var.

X kullanıcısı olmayan bir pencerede sistem kullanıcı oturum birimlerinin nasıl kullanılacağını bulmak için yalnızca tty sunucusu bulmak için çaba harcadı. İşte temel adımlar:

1) Kök çalışması olarak apt-get install libpam-systemd. Kullandığım bazı Debian 8.8 sistemlerinde bunu yaptıktan sonra bile gerekliydi apt-get update. Bu, önemli ortam değişkenleri de dahil olmak üzere kullanıcılar oturum açtığında bir DBus oturum kapsamı ve sistemd kullanıcı işlem yöneticisi oluşturur. Ne yazık ki, TÜM önemli değişkenler kurulmamış ve bu Debian OS'nin düzeltmesi gereken şey.

2) Kullanıcı oturumunuzun önyükleme sırasında başlatılmasını istiyorsanız, kullanıcının oturum açmasına gerek kalmaması ve yeniden başlatmalar arasında kök yürütmesi için devam etmesi gerekmiyorsa loginctl enable-linger <user account name>. Bu, kullanıcı @ .service systemd işleminin tüm oturum açma oturumları kapatıldıktan sonra bile kalmasını sağlar ve otomatik olarak sistem önyüklemesinde başlar.

3) Maalesef önemli ortam değişkenleri Debian 8.8'de doğru bir şekilde ayarlanmadı ve düzeltilmesi gerekiyor, ancak yapılması zor değil. Kullanıcının .profile veya .bashrc komut dosyasında şunu ekleyin: DBus iletişimi kullanıcı oturumu için yuvaları içeren takip eden klasörü export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/systemd" denetleyebilmelisiniz /run/user/$UID/. Debian 8.8’de bu “sistem” dir.

Tüm sistem birimlerinin sırayla doğru şekilde başlatılması için yeniden başlatmanız gerekebileceğini unutmayın. exportHiçbir hata olmadan çalıştırırsanız , XDG_RUNTIME_DIR = "/ run / user / id -u" ve XDG_SESSION_ID değerinin bir değere ayarlandığını görmelisiniz. Eğer yoksa, sistem kullanıcı oturumunuzda hala bir sorun var. Eğer ssh ile giriş yaparsanız / etc / ssh / sshd_config 'in UsePAMlibpam-systemd kodunun çalıştırılması için yes ' e ayarlandığını kontrol edin .

Libpam-systemd ile ilişkili systemd birimlerinin güncellenmesi gerektiğinden şüpheleniyorum, böylece şu anda eksik olan tüm env değişkenlerini ayarladılar. /Etc/systemd/user.conf dosyasında düzeltmeyi DefaultEnvironment=ayarlayarak ve ayarlayarak düzeltmek mümkün olabilir DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/systemd", ancak bunun işe yarayacağından emin değilim.

İşte yardımcı olabileceğiniz birkaç link: 1: 7.10. Sistem Kullanımı ve Konfigürasyon 2: D-Bus'a komut satırından 3 göz atın : Seansınızı sistemd ile yönetin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.