まず、起動時にコマンドを実行するための最良の方法は何ですか、cron?シェルスクリプトでsu
を使用して、異なるユーザーを切り替えることはできますか?
起動時にいくつかの切り離されたscreen
セッションを作成するにはどうすればよいですか? screen -A -m -d -S test ./script.sh
は動作するはずですが、cronによって開始されたスクリプトで使用しても、起動後に実行されている画面セッションは表示されません。
コマンドの実行が終了した後、画面セッションが閉じているように見えますが、出力を確認できるように開いたままにしておくことはできますか?
ありがとう!
システムの起動時にコマンドを実行するには、cronで@reboot
にコマンドをスケジュールします。詳細については、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'
画面には有限数の履歴行しか保持されないことに注意してください。 script.sh
が時々対話を必要としない限り、その出力をファイルにリダイレクトすることでより良いサービスが提供されます。対話が必要な場合は、screenのlog
コマンドを使用して出力をファイルに送信できます(入力が不要なときにscreenセッションが終了しても問題ありません)。
やってみました screen -AmdS test bash -i ./script.sh
?
何が起こっているのかと思いますが、それはスクリプトを実行するscreenを開始し、スクリプトが終了するとscreenが終了します。 bash -i
partは、インタラクティブモードでbashを起動し、bashにスクリプトを実行させるように画面に指示します。スクリプトの実行が完了すると、bashはコマンドプロンプトで待機し続け、システムにログインすると接続できるように画面セッションを開いたままにします。
やりたいことを実行するスクリプトを作成します。 1つのコマンドだけでユーザーを切り替える場合は、先に進んでsu -c
を使用します。それ以外の場合は、別のスクリプトを作成してそれを呼び出します。
次に、起動時にコマンドを実行するには、スクリプトを実行するコマンドを/etc/rc.d/rc.local
に配置します。