Как запустить приложение при запуске от имени определенного пользователя?

Как запустить приложение при запуске от имени определенного пользователя?

Есть ли способ запустить приложение при загрузке системы под определенной учетной записью пользователя?

Например, я хотел бы, чтобы a_small_appзапускался под учетной записью пользователя bob(которая находится в группе bobsgroup). Нужно ли что-то добавлять в /etc/init.d?

Примечание: Я не хочу, чтобы приложение запускалось.после входа пользователя в системуа скорее при запуске компьютера.

решение1

Метод, не зависящий от системы запуска. Вы можете использовать его в /etc/rc.local, /etc/init.d/...скрипте, файле конфигурации Upstart и, возможно, также в конфигурации systemd.

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

Эта команда будет запущена как пользователь root и sudoперейдет к пользователю "oli". Очевидно, измените пользователя и команду для ваших целей.

Я должен добавить, что есть по крайней мере дюжина способов сделать именно это... Но по моему опыту, все они в значительной степени идентичны по эффекту. Вот пример upstart, использующий его setuidстрофу:

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

setuid oli
respawn

exec /full/path/to/application

решение2

Не уверен насчет старых версий Ubuntu, но последние также позволяют использовать @reboot(см. напримерздесь в Ubuntu Wiki, прокрутите немного вниз или нажмите Ctrl+F, чтобы перейти к@перезагрузить).

Это может быть полезным выбором, когда вы хотите, чтобы пользователь мог запускать свои собственные команды во время загрузки без необходимости становиться root (или чтобы кто-то, имеющий доступ к учетной записи root, сделал это за него) или даже без необходимости входа в систему. Если это работает, это работает и без входа в систему.

Итак, от имени «bob» введите crontab -e, а затем добавьте новую строку в конец открывшегося файла, например:

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

Если это не сработает, вам, возможно, стоит проверить переменные окружения, особенно PATH. Я обычно устанавливаю HOMEи PATHявно поверх crontab. Что-то вроде:

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

Методика выяснения причин, по которым это может не работать:

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

... а затем /tmp/a_small_app.logчерез 60 секунд откройте его в своем любимом редакторе и посмотрите, есть ли там какая-нибудь полезная информация.

При попытке @rebootсегодня инициироватьtmuxсеанс, в котором должна находиться команда, которую нужно запустить, сегодня я наткнулся на упрямый скрипт, который в итоге заработал с помощью этого маленького трюка. Показываю его в сочетании с вышеприведенной вещью для ведения журнала:

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

решение3

Похоже, первый ответ больше не работает в Ubuntu 14.10.

Вот как я это делаю (помещаю в /etc/rc.local)

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

Связанный контент