从rc.local启动时运行一个屏幕会话

我试图在启动时在rc.local中的特定用户下运行分离的屏幕。 下面的代码是我到目前为止所做的,但它对我不起作用。 su部分似乎给了我一个错误。

su - username -c /usr/bin/screen -dmS test bash -c '/var/www/path/to/script/script.sh; exec bash' 

我认为-c参数( subash )必须至少引用。

 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 – 返回GNU screenCtrl + A.

它允许将窗口分成几乎任意数量的窗格(垂直水平),其配置文件格式(包括状态标准格式)实际上是人类可理解的。 当然,当你只想运行一些原本不是在后台编写为守护进程的程序/脚本时, tmuxscreen一样好。 但是,如果您打算与终端多路复用器进行交互,我热烈推荐使用tmux

尝试使用sudo -u username而不是su - username

这是我用过的,我发现它是最干净,最简单的(我自己测试过):

将“user”替换为用户以将其运行为。 将“nameyouchoose”替换为屏幕会话的名称将“/script/start.bash”替换为脚本的路径。

 /usr/bin/sudo -u user /usr/bin/screen -dmS nameyouchoose /script/start.bash 

来源: http : //realtechtalk.com/How_to_start_screen_in_bash_script_or_from_etcrclocal_on_startup_as_a_specific_user-1980-articles