
Есть ли способ запустить приложение при загрузке системы под определенной учетной записью пользователя?
Например, я хотел бы, чтобы 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>"