2013-08-06 24 views
6

Bir USB aygıtından girişi kodlayan ve bir php komut dosyasına komut gönderen bir python betiğim var. Komut konsoldan çalıştırıldığında güzel çalışır, ancak başlangıçta çalıştırılmaya ihtiyacım var.systemd'den kalıcı bir python betiği çalıştıran?

systemctl start service-name işleminin beni hiçbir zaman komut istemine döndürmemesi dışında iyi çalıştığını düşündüğüm betiği başlatmak için bir systemd hizmeti oluşturdum. Çalışırken, giriş cihazıyla tam olarak beklendiği gibi etkileşim kurabilirim. Ancak, ctr-z ile systemctl start işleminden çıkılırsa, komut dosyası yalnızca birkaç saniye boyunca çalışmaya devam eder. İşte

Yazdığım .service dosyasıdır:

[Unit] 
After=default.target 

[Service] 
ExecStart=/usr/bin/python /root/pidora-keyboard.py 

[Install] 
WantedBy=default.target 

ve burada benim python komut dosyası: Ben böylece hizmet dosyasından uyumsuz çalıştırmak script yapabilirim nasıl

#!/usr/bin/env python 
import json, random 
from evdev import InputDevice, categorize, ecodes 
from urllib.request import urlopen 

dev = InputDevice('/dev/input/event2') 

def sendCommand(c): 
    return json.loads(urlopen("http://127.0.0.1/api.php?command="+c).read().decode("utf-8")) 
def getRandomStation(): 
    list = sendCommand('stationList') 
    list = list['stations'] 
    index = random.randint(0, (len(list)-1)) 
    print(list[index]['id'] + " - " + list[index]['name']) 
    sendCommand('s' + list[index]['id']) 

print(dev) 
for event in dev.read_loop(): 
    if event.type == ecodes.EV_KEY: 
     key_pressed = str(categorize(event)) 
     if ', down' in key_pressed: 
      print(key_pressed) 
      if 'KEY_PLAYPAUSE' in key_pressed: 
       print('play') 
       sendCommand('p') 
      if 'KEY_FASTFORWARD' in key_pressed: 
       print('fastforward') 
       sendCommand('n') 
      if 'KEY_NEXTSONG' in key_pressed: 
       print('skip') 
       sendCommand('n') 
      if 'KEY_POWER' in key_pressed: 
       print('power') 
       sendCommand('q') 
      if 'KEY_VOLUMEUP' in key_pressed: 
       print('volume up') 
       sendCommand('v%2b') 
      if 'KEY_VOLUMEDOWN' in key_pressed: 
       print('volume down') 
       sendCommand('v-') 
      if 'KEY_CONFIG' in key_pressed: 
       print('Random Station') 
       getRandomStation() 

start komutu tamamlanabilir ve betik arka planda çalışmaya devam edebilir mi?

+0

Eğer 'ExecStart' satırınızın sonuna bir '&' eklediyseniz ne olur? Bu betiğin arka planda çalıştırılmasını zorlamaz mı? [Örneğin] (http://bashitout.com/2013/05/18/Ampersands-on-the-command-line.html). – wflynny

+0

@Bill, şu anda 'ExecStart =/usr/bin/python /root/pidora-keyboard.py &>/dev/null & 'öğesinin aşırı sürümünü denedi ve yine de kilitleniyor ve eğer onu öldürürsem alt işlem Birkaç saniye sonra öldürüldü. –

+0

'[Service]' altındaki 'Type = forking' nedir? Bunu yaparsanız, muhtemelen '& 'de kaldırmalısınız. – wflynny

cevap

1

Usig nohup'dan ne haber? http://en.wikipedia.org/wiki/Nohup nohup, HUP (asılması) sinyalini yok saymak için bir POSIX komutudur. HUP (asik) sinyali, bir terminalin bagimsiz baglanti süreçlerini uyarma biçimidir.

3

Hem After=default.target hem de WantedBy=default.target numaralı öğeleri belirttiniz. Bu çözülebilir değildir.

WantedBu, başlatma sırasında hedefin bu hizmeti içereceğini belirtir, ancak sonra, bu hizmete başlamadan önce adlandırılmış hedefin dolduğundan emin olmak için aracı!

Büyük olasılıkla After=default.target gerekir ve bunu kaldırmanız gerekir.


Ben de açıkça hizmet Type= belirtmek düşündürmektedir. Varsayılan şu anda simple (yaptığınız şey için çalışmalıdır) sistemdeyken eski sürümleri farklı davrandı olabilir.

[Service] 
Type=simple 
İlgili konular