まず、起動時にコマンドを実行する最適な方法は cron ですか?su
シェル スクリプトで使用して異なるユーザーを切り替えることはできますか? できる場合、その方法は?
screen
起動時に複数の分離されたセッションを作成するにはどうすればscreen -A -m -d -S test ./script.sh
よいでしょうか? 動作するように見えますが、cron によって開始されたスクリプトで使用すると、起動後に実行されている画面セッションが表示されません。
コマンドの実行が完了すると screen セッションが閉じられるようですが、出力を確認できるように開いたままにしておくことはできますか?
ありがとう!
答え1
システムの起動時にコマンドを実行するには、@reboot
cronでスケジュールを設定します。man 5 crontab
詳細については、を参照してください。つまり、crontabの行は次のようになります。
@reboot screen -m ...
そのために は使用せずsu
、コマンドを実行するユーザーの crontab にコマンドを配置します。 そうすれば、ユーザーは root の介入なしにコマンドを管理できます。 (ただし、セキュリティ上の理由から、システム ユーザーがコマンドを変更できないようにして、システム ユーザーとしてコマンドを実行したい場合は、 のようなものがsu -c /path/to/command www-data
適し/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