Ich versuche, Upstart so zu konfigurieren, dass ein kleines Dienstprogramm ausgeführt wird, das als systemweiter Daemon auf ein tty zugreifen muss. Wenn das Dienstprogramm über die Befehlszeile ausgeführt wird, bleibt es im Vordergrund und wird erst mit Strg + C beendet. Ich habe daher die expect
Zeilengruppe weggelassen und Upstart verfolgt die PID korrekt. Ich habe auch ein nicht privilegiertes Konto für den Daemon erstellt adduser --system --no-create-home --disabled-login avrlirc
.
Auf meinem System wird das tty, auf das das Dienstprogramm zugreifen muss, wie folgt installiert:
crw-rw---- 1 root dialout 166, 0 May 24 19:25 ttyACM0
Also habe ich den Benutzer avrlirc
(oben erstellt) zur dialout
Gruppe hinzugefügt . Wenn ich das Dienstprogramm ausführe, avrlirc
funktioniert alles wie erwartet. Ich habe die Zeilengruppe setuid avrlirc
zur Upstart-Konfigurationsdatei hinzugefügt , und der Job schlägt mit "tty kann nicht geöffnet werden" fehl.
Wenn ich die Zeilengruppe weglasse setuid
, funktioniert sie (also ist es wahrscheinlich eine Berechtigungssache). Wenn ich die setgid dialout
Zeilengruppe neben dem hinzufüge setuid
, funktioniert es auch.
Warum brauche ich das, setgid
wenn ich es bereits habe setuid
und der Benutzer Mitglied der entsprechenden Gruppe ist - warum reicht das nicht aus?
Als Referenz lautet die Konfigurationsdatei für den Upstart-Job:
start on runlevel [2345]
stop on runlevel [016]
console log
setuid avrlirc
setgid dialout
exec /usr/local/bin/avrlirc2udp -f -H -h <IP_ADDRESS> -t /dev/ttyACM0
Wo <IP_ADDRESS>
ist die IPv4-Adresse der lokalen Box und innerhalb von 192.168.0.0/16.
avrlirc2udp
( Details ), das serielle Eingaben von einem Arduino Uno mit IR-Empfänger akzeptiert und über UDP an LIRC weiterleitet.