首先,在启动时执行命令的最佳方法是什么,cron?我可以su
在 shell 脚本中使用它来在不同用户之间切换吗?如果可以,该怎么做?
如何screen
在启动时创建多个独立会话?screen -A -m -d -S test ./script.sh
似乎应该可以工作,但在 cron 启动的脚本中使用它不会显示启动后正在运行的任何屏幕会话。
看起来命令执行完成后屏幕会话就关闭了,我可以保持它打开以便可以看到输出吗?
谢谢!
答案1
要在系统启动时运行命令,请将其安排@reboot
在 cron 中。请参阅man 5 crontab
了解详情。这意味着您的 crontab 行应如下所示
@reboot screen -m ...
不要使用su
这个,将命令放在应该运行该命令的用户的 crontab 中。这样,用户可以在没有 root 干预的情况下管理命令。(但是,如果您想以系统用户的身份运行命令,而不让该系统用户出于安全原因更改命令,那么像su -c /path/to/command www-data
in这样的方法/etc/rc.local
会更好。)
Screen 在命令完成后关闭窗口,并在最后一个窗口关闭时终止会话。如果您想在脚本完成后查看其输出,请在脚本之后运行另一个命令以等待输入。例如,要使窗口保持打开状态直到您按下Enter它:
screen sh -c './script.sh; read'
请记住,screen 仅保留有限数量的历史记录行。除非script.sh
有时需要交互,否则最好将其输出重定向到文件。如果确实需要交互,您可以使用 screen 的log
命令将输出发送到文件(这样,如果 screen 会话在不需要输入时终止,就不会有问题了)。
答案2
你有没有尝试过screen -AmdS test bash -i ./script.sh
?
我想象发生的事情是它启动了 screen,然后运行脚本,然后当脚本退出时,screen 终止。该bash -i
部分告诉 screen 以交互模式启动 bash,然后让 bash 运行脚本。脚本执行完成后,bash 将继续在命令提示符处等待,并在您登录系统后保持 screen 会话打开,以便您附加到其中。
答案3
创建一个可执行所需操作的脚本。如果在用户之间切换只是为了执行单个命令,那么请继续使用su -c
。否则,创建一个单独的脚本并调用该脚本。
然后,为了让命令在启动时运行,请将运行脚本的命令放入/etc/rc.d/rc.local