Linux systemd problemim

Bir script yazdım. Script uzaktan ekran görüntüsü alıyor. Bi sunucu bi de client tarafı var. Normal olarak çalıştırınca program fıstık gibi çalışıyor.
Lakin linux systemd ile çalışınca ekran görüntüsü karşıya gelmiyor. Systemd service de şöyle. Root olarak makineye giriş yapınca ekran görüntüsü geliyor. Ama başka kullanıcı olarak girince görüntü gerektiren hiç bişi çalışmıyor. Tkinter bile açılmıyor.

Programda pyscreenshot kullanıyorum.

Yardım ederseniz sevinirim. Gerekli bilgileri isterseniz verebilecek olduğum bilgileri verebilirim

Teşekkürler

https://www.linuxquestions.org/questions/linux-desktop-74/start-gui-application-from-systemd-unit-service-4175591018/

Buradaki gibi bir çözüm yaptım. Root olarak giriş yapınca çalışıyor. Ama normal bi kullanıcı olarak çalışınca ekran görüntüsü sunucuya gitmiyor

Servisi nasıl kaydettiniz? Yani tüm kullanıcılar için mi geçerli bu servisin çalışması?

Servis bilgisyar açılınca açılıyor

[Install] 
WantedBy=graphical.target

bilgisyar açılınca yanlış ifade oldu.

[Service]
Environment="DISPLAY=:0.0"
Environment="XAUTHORITY=$XAUTHORITY"
User=root
Group=root
RemainAfterExit=no


client.service dosyasının bir ksımı geri kalanı açıklama , çalıştırma falan

Hatam büyük ihtimalle bu ama nasıl çözeceğimi anlamadım

Service dosyasında da belirttiğin gibi, bu servisin sadece root kullanıcısı için çalıştırılmasını sen seçmişsin. Yani sorun kullanıcı ve grup seçiminde

Peki bütün kullanıcılar için ne yapmam lazım

Hangi kullanıcı login olursa onun ekran görüntüsü gelsin istiyorum sadece root kullanıcıda ekran geliyor

@aib @coderistan @ismailarilik @dildeolupbiten
@Cihat_Altiparmak

Not:user=root ve Group=root u da sildim çalışmadı

Ayrıca bilgisayara başka bi kullanıcı ile girip python3 client.py olarak girince de çalışıyor sadece root dışında bir kullanıcı ile girince bilgisyar açılınca, o zaman ekran paylaşılmıyoe

Geldim.

Oncelikle, 8 tane problemi ayni anda debug etmeye gerek yok. Goruntu mu alinmiyor, baglanti mi kurulmuyor, baglantidan data mi gitmiyor, emin olman lazim. Goruntunun alinmadigi varsayimiyla yola cikmissin, belki de cok daha basit bir hata var.

Aksiyon: Programi, ekran goruntusu alip kaydedecek minimum parcaya indir. Hakkinda konusmasi (kodu paylasmasi) da kolay olur.

Ilk olarak bakilmasi gereken seyler effective UID, effective GID ve environment.

Bunlar o isi hallediyor gibi gozukuyor ama environment’ta sadece 2 tane variable var, onlar da X ile alakali. Sistemin X kullandigindan bile emin miyiz?

Aksiyon: Programin elle calistirilmasi ile systemd tarafindan calistirilmasindaki environment farklarina bakila, ikincisi ayarlana.

Bu graphical'dan sonra calismasini garantilemiyor, farkinda misin? Program X’ten once calistiginda dogru calisiyor mu?

Tkinter kutuphane degil miydi, acilmamasi ne demek?

Bağlantı sağlanıyor. Ama ekran görüntüsü sunucuya gitmiyor.

Tkinter açılmıyor derken tkinterda pencere oluşmuyor.

1 Like

Effective uide falan nasıl bakıcam?

Environmentlere nasıl bakacağım

@aib varken bana söz düşmez ama, ben servis hiç çalıştırılmıyor diye düşündüm. Pencere oluşmuyorsa, o zaman @aib nin de dediği gibi environment ayarlamasında sıkıntı var.

Gelecek cevapları ben de bekliyorum :slight_smile:

Servis çalışıyor. Nerden anladın dersen. İstemci bilgiayar açılınca bağlantı sağlanıyor.hatta konut gönderme, kullanıcı ekleme, paket yükleme gibi işlemler de yapılıyor. Lakin ekran görüntüsü yok, gitmiyor. He bi de gitmiyor derken eğer root olarak giriş yaparsam ekran görüntüsü sunucuya geliyor. Ama başka kullanıcı ile girince ekran görünütüsü gelmiyor

@aib gerekli şeyleri söyle ben sana atayım eğer atabilirsem.

1 Like

Acikcasi arastirmani bekledim ama id ve printenv komutlarina bakabilirsin.

Bu arada hizli bir workaround denemesi olarak sudo -u <kullanici> <servis_komutu> deneyebilirsin.

Sahi, servis komutu ne?

Okul falan var şahsen pek bakamıyorum ama hafta sonu bakacağım.

Servis şöyle çalışıyor /usr/bin/python3 /root/client.py
Yani execstart böyle

Hah okey
Aklinda bulunsun, ful unit dosyasini paylas bir dahaki sefere.

Kodun basitlestirilmis bir hali de yok; sorunun sebebini debug edemeyecegiz ama environment’i duzeltmek cozecektir muhtemelen. DISPLAY veya benzeri X/Wayland degiskenlerinden biridir.

1 Like

Bu akşam atacağım. Unit dosyasını ve kodun sadeleşmş kısmını

server.py


import socket
import cv2
import struct
import numpy as np
from PIL import ImageGrab
from time import sleep
import pickle

con = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
con.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
con.bind(("localhost",3344))
con.listen(1)
while True:
    
    conn , addr = con.accept()
    if conn:
        break
    else:
        continue
data = b''
payload_size = struct.calcsize("L")

while True:
    sleep(0.2)
    while len(data) < payload_size:
        data += conn.recv(4096)
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
    while len(data) < msg_size:
        data += conn.recv(4096)

    frame_data = data[:msg_size]
    data = data[msg_size:]

    
    frame = pickle.loads(frame_data)
    cv2.imshow("rrame",frame)
                   
    if (cv2.waitKey(1) & 0XFF) == ord('q'):
        break

cv2.destroyAllWindows()
conn.close()
con.close()
client.py

import socket
import cv2
import pyscreenshot  as ImageGrab
import numpy as np
import pickle
import struct


sock_u = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while True:
    try:
        sock_u.connect(("localhost",3344))
        break
    except:
        continue
while True:
        
    
    img = ImageGrab.grab(bbox=(0,0,500,500))
    frame = np.asanyarray(img)
    data = pickle.dumps(frame)
    message_size = struct.pack("L", len(data))
    sock_u.sendall(message_size + data)


cv2.destroyAllWindows()
con.close()

cli.service

[Unit]
Description =  asda

After=network.target 

PartOf=graphical-session.target

[Service]


RemainAfterExit=no
Type=simple
Requires=network.target graphical.target
Environment="DISPLAY=:0.0"
Environment="XAUTHORY=$XAUTHORY"
ExecStart=/usr/bin/python3 /root/cli.py

[Install]
WantedBy=graphical.target

kurulum komutum
root halde iken

#./ systemctl enable /lib/systemd/system/cli.service
#./ systemctl daemon-reload
#./ systemctl start cli.service

Not:Gene aynı sorun çıktı root olarak girince ekran görüntüsü geliyor.Ama başka kullanıcı ile girince ekran görüntüsü gelmiyor.
Scriptimi bu kadar küçültebildim. Lütfen server kısmını linuxda kullanıcı girişi yaptıktan sonra çalıştırın.
Normalde programım bu işi hallediyor ama daha fazla kodu uzatmaya gerek yok.
Not2:linux sistemlerde PIL : imagegrab kabul etmiyor o yüzden pyscreenshot kullandım

NOT:Lütfen ip adreslerini vs. kendinize göre düzenleyin. @aib bu yeter mi zaten bunlar üzerinde çalıştığımda da aynı şey oluyor root olarak girince ekran görüntüsü socket aracılığı ile geliyor lakin başka kullanıcı ile girince ekran görüntüsü gelmiyor

@aib @coderistan @ismailarilik @dildeolupbiten