我正在尝试在启动时在 rc.local 中以特定用户身份运行分离屏幕。下面的代码是我目前拥有的,但它对我来说不起作用。su 部分似乎给了我一个错误。
su - username -c /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'
答案1
我认为至少应该引用两个-c
参数(su
和)。bash
su - username -c "/usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'"
预计也-
将是最后一个,并且可能不适合这里(参见man su
)。
还有几点评论。sudo
可以对于像你这样的一次性命令来说是一个更好的选择,但不一定:
sudo -iu username /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash'
具体来说,您可以使用更少一级的引用sudo
。
另一件需要注意的事情是在特权上下文中执行没有绝对路径的命令。这适用于su
(或sudo
),也适用于命令中的路径bash
。你用 做对了screen
。
刚刚测试了以下内容,效果很好。我认为这-
是你原话中的主要问题:
/bin/su username -c "/usr/bin/screen -dmS test bash -c '/home/username/test.sh; exec bash'"
恶毒言论:你为什么不给tmux
试试?我最近换了,从此再也没有后悔过。我唯一需要立即更改的是前缀组合键,默认tmux
为Ctrl+ B- 改回 GNUscreen
的Ctrl+ A。
它允许将窗口拆分成几乎任意数量的窗格(垂直和水平方向)并且其配置文件格式(包括状态部分的格式)实际上对人类来说是可以理解的。当然,当您只想在后台运行一些最初不是作为守护进程编写的程序/脚本时,tmux
这同样好screen
。但是,如果您打算与终端多路复用器交互,我强烈建议您使用tmux
。
答案2
这是我使用过的,我发现它是最干净和最简单的(我自己测试过):
将“user”替换为要运行该脚本的用户。将“nameyouchoose”替换为屏幕会话的名称。将“/script/start.bash”替换为脚本的路径。
/usr/bin/sudo -u user /usr/bin/screen -dmS nameyouchoose /script/start.bash
答案3
以当前用户身份(rc.local = root)在新的分离屏幕中启动脚本:
screen -dmS <session name> <command>
, 例子:
screen -dmS screenName bash /home/user/run.sh
从 rc.local 启动脚本如下user
:
runuser -l user -c 'screen -dmS screenName bash /home/user/run.sh'
答案4
尝试sudo -u username
代替su - username