启动时自动登录用户到 TTY,然后在 GNU 屏幕内自动运行命令

启动时自动登录用户到 TTY,然后在 GNU 屏幕内自动运行命令

Ubuntu 14.04.5 LTS

所需功能: 远程 Ubuntu 服务器启动后,会自动以指定用户身份启动正在进行的进程。然后,我可以稍后远程登录并查看正在进行的进程的过去和当前屏幕输出。

当前计划:

自动化步骤:

  1. 用户“ubuntu”在启动时自动登录到终端(TTY):

    "sudo nano /etc/init/tty1.conf"
    
    Change: exec /sbin/getty -8 38400 tty1
    
    To: exec /sbin/getty --autologin ubuntu -8 38400 tty1
    
  2. 用户“ubuntu”运行 GNU screen:

    screen -d -m -S screenname
    
  3. 用户“ubuntu”在 GNU screen 中运行正在进行的进程:

    screen -S screenname -p 0 -X stuff "command^M"
    

稍后的手动步骤:

  1. 我以用户“ubuntu”的身份在另一个终端(TTY)上远程登录。
  2. 我重新连接到步骤 2 中启动的 GNU screen 会话:

    screen -r
    
  3. 我能够查看步骤 3 中启动的流程的过去和当前的输出。

问题:

  • 这是实现预期结果的最有效方法吗?
  • 如何自动执行步骤2和3中的命令?
  • 步骤 2 和 3 中的命令如何不是当我在步骤4中手动登录时是否激活?

答案1

答案(针对我自己的问题)

  • 这是实现预期结果的最有效方法吗?
    我仍然不确定下面的解决方案是否最有效,但我可以确认它至少在 Ubuntu 上所述版本上运行良好。
  • 如何自动执行步骤2和3中的命令?
  • 为什么我第 4 步手动登录时第 2 步和第 3 步的命令无法激活?

    步骤1
    我将以下内容放在上述第 1 步中自动登录的用户的用户目录中的 .profile 文件底部 (/home/ubuntu/.profile):

    pgrep processname || /home/ubuntu/processscript.sh
    

    当用户自动登录时,此命令将自动执行,因为它位于 .profile 中。命令的第一部分(“||”之前)检查“processname”是否已在运行。如果没有,它将执行命令的第二部分(“||”之后),即“processscript.sh”...如果“processname”已在运行,则不会运行。

    此检查是必要的,因为我想要运行的进程不能同时运行多个实例。此外,它解决了我稍后手动登录时进程再次运行的问题。

    第二步
    创建一个名为“processscript.sh”的shell脚本文件,内容如下:

    #!/bin/bash
    screen -d -m -S screenname &&
    screen -S screenname -p 0 -X stuff "/home/ubuntu/command.sh^M"
    

    确保“processscript.sh”位于 /home/ubuntu 目录中,并且可以使用以下命令执行:

    chmod 744 processscript.sh
    

    上述 shell 脚本创建一个名为“screenname”的屏幕实例,如果成功完成,它会用带有回车符的命令“command.sh”填充该屏幕实例的命令行(这就是末尾的“^M”所做的)。

    第三步
    在上一步中,我在向屏幕命令行填充带有属性的命令时遇到了一些问题(我认为需要进行一些字符转义)。为了简单地解决这个问题,我将带有属性的完整命令添加到 shell 脚本中并改用该脚本。因此,创建另一个名为“command.sh”的 shell 脚本(如上所述),并在其中添加完整命令。

相关内容