有没有办法让某个应用程序在某个用户帐户下启动时启动?
例如,我希望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”用户。显然,请根据您的目的更改用户和命令。
我应该补充一点,至少有十几种方法可以做到这一点……但根据我的经验,它们的效果大致相同。以下是使用其setuid
节的 upstart 示例:
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
。我通常在 crontab 上明确设置HOME
和。类似的东西:PATH
# 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>"