起動時にユーザーをTTYに自動ログインし、GNU screen内でコマンドを自動実行する

起動時にユーザーをTTYに自動ログインし、GNU screen内でコマンドを自動実行する

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. 別の端末 (TTY) でユーザー「ubuntu」としてリモートでログインします。
  2. 手順 2 で開始した GNU screen セッションに再度接続します。

    screen -r
    
  3. ステップ 3 で開始したプロセスの過去と現在の出力を表示できます。

質問:

  • これは望ましい結果を達成するための最も効果的な方法でしょうか?
  • ステップ 2 と 3 のコマンドを自動化するにはどうすればよいですか?
  • ステップ2と3のコマンドはどのようにないステップ 4 で手動でログインするとアクティブになりますか?

答え1

回答(私自身の質問に対して)

  • これは、望ましい結果を達成するための最も効果的な方法でしょうか?
    以下の解決策が最も効果的かどうかはまだわかりませんが、少なくとも Ubuntu の指定されたバージョンでは機能することを確認できます。
  • ステップ 2 と 3 のコマンドを自動化するにはどうすればよいですか?
  • ステップ 4 で手動でログインすると、ステップ 2 と 3 のコマンドがアクティブにならないのはなぜですか?

    第一歩
    上記の手順 1 で自動的にログインするユーザーのユーザー ディレクトリ (/home/ubuntu/.profile) の .profile ファイルの下部に次の内容を追加します。

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

    ユーザーが自動的にログインすると、このコマンドは .profile にあるため自動的に実行されます。コマンドの最初の部分 (「||」の前) は、「processname」がすでに実行されているかどうかを確認します。実行されていない場合は、コマンドの 2 番目の部分 (「||」の後)、つまり「processscript.sh」を実行します...「processname」がすでに実行されている場合は実行されません。

    実行したいプロセスでは複数のインスタンスを同時に実行できないため、このチェックは必要でした。さらに、後で手動でログインしたときにプロセスが 2 度目に実行されるという問題も解決します。

    ステップ2
    次の内容を含む「processscript.sh」というシェル スクリプト ファイルを作成します。

    #!/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
    

    上記のシェル スクリプトは、「screenname」という名前の画面インスタンスを作成し、正常に完了すると、その画面インスタンスのコマンド ラインに、キャリッジ リターン付きのコマンド「command.sh」を詰め込みます (末尾の「^M」が行う処理)。

    ステップ3
    前の手順では、属性付きのコマンドを画面のコマンドラインに詰め込むときに問題が発生しました (一部の文字のエスケープが必要だったと思います)。これを簡単に解決するには、属性付きの完全なコマンドをシェル スクリプトに追加し、代わりにそれを使用しました。したがって、(上記のような) 「command.sh」という別のシェル スクリプトを作成し、そこに完全なコマンドを追加します。

関連情報