Wie führe ich eine Anwendung beim Start als bestimmter Benutzer aus?

Wie führe ich eine Anwendung beim Start als bestimmter Benutzer aus?

Gibt es eine Möglichkeit, eine Anwendung beim Start unter einem bestimmten Benutzerkonto zu starten?

Ich möchte beispielsweise, dass es a_small_appunter dem Benutzerkonto ausgeführt wird bob(das sich in der Gruppe befindet bobsgroup). Muss ich etwas hinzufügen /etc/init.d?

Hinweis: Ich möchte nicht, dass die Anwendung gestartet wirdnachdem sich ein Benutzer angemeldet hatsondern beim Start des Computers.

Antwort1

Eine systemunabhängige Startmethode. Sie können diese in /etc/rc.localeinem /etc/init.d/...Skript, einer Upstart-Konfigurationsdatei und wahrscheinlich auch in einer systemd-Konfiguration verwenden.

sudo -u oli /full/path/to/application

Dieser Befehl wird als Root-Benutzer ausgeführt und sudowechselt zum Benutzer „oli“. Ändern Sie den Benutzer und den Befehl natürlich entsprechend Ihren Anforderungen.

Ich sollte hinzufügen, dass es mindestens ein Dutzend Möglichkeiten gibt, genau dies zu tun ... Aber meiner Erfahrung nach sind sie alle im Wesentlichen identisch in ihrer Wirkung. Hier ist ein Beispiel aus der Anfangsphase, das die setuidStrophe verwendet:

start on (filesystem and stopped udevtrigger)
stop on runlevel [06]

setuid oli
respawn

exec /full/path/to/application

Antwort2

Ich bin mir nicht sicher, wie das bei älteren Ubuntu-Versionen ist, aber neuere erlauben auch die Verwendung von @reboot(siehe z. B.hier im Ubuntu Wiki, scrollen Sie ein wenig nach unten oder verwenden Sie Strg+F, um@Neustart).

Dies kann eine nützliche Option sein, wenn Sie möchten, dass ein Benutzer beim Booten seine eigenen Befehle ausführen kann, ohne dass er Root sein muss (oder dies von jemandem mit Zugriff auf das Root-Konto für ihn tun lassen muss) oder sich überhaupt anmelden muss. Wenn es funktioniert, funktioniert es ohne Anmeldung.

Geben Sie also als „bob“ ein crontab -eund fügen Sie dann am Ende der geöffneten Datei eine neue Zeile hinzu, etwa:

# bottom of bob's crontab
@reboot /path/to/a_small_app

Falls es nicht funktioniert, sollten Sie Ihre Umgebungsvariablen überprüfen, insbesondere PATH. Normalerweise setze ich HOMEund PATHexplizit über der Crontab. So etwas wie:

# top of bob's crontab
HOME=/home/bob
PATH=/home/bob/.local/bin:/usr/local/bin:/usr/bin:/bin

So finden Sie heraus, warum es möglicherweise nicht funktioniert:

# bottom of bob's crontab
* * * * * /path/to/a_small_app 2>&1 | tee /tmp/a_small_app.log # will run every minute

... und öffnen Sie es dann /tmp/a_small_app.lognach 60 Sekunden in Ihrem bevorzugten Editor, um zu sehen, ob es nützliche Informationen enthält.

Beim Versuch, @rebootheute einetmuxSitzung, in der der auszuführende Befehl laufen soll, bin ich heute über ein störrisches Skript gestolpert, das mit diesem kleinen Trick funktioniert hat. Hier in Kombination mit der obigen Protokollierungssache:

@reboot tmux new-session -d -s mysession "bash -c '/path/to/a_small_app 2>&1 | tee /tmp/a_small_app.log'"

Antwort3

Es scheint, dass die erste Antwort unter Ubuntu 14.10 nicht mehr funktioniert.

So mache ich es dort (lege es in /etc/rc.local ein)

su <username> - -c "<command>"

verwandte Informationen