重複しているように聞こえるかもしれませんが、まず聞いてください。
標準入力がアクティブで、起動時に入力が必要になることがあるシェル スクリプトを実行します。24 時間 365 日実行する必要がありますが、失敗した場合はコマンドを入力するか、プロンプトが表示されたら「y」を入力するだけで再起動する必要があります。すでに 2 つの方法を試しました。nohup を使用する方法と、Ctrl+Z をクリックする方法、bg を入力する方法のどちらも、ジョブが停止していて実行されていないと表示されます。実行したときだけfg
アクティブになります。この問題を解決する方法はありますか?
PS 私も試してみましたが、scriptcommand &
やはり「停止」で終わります。
これを systemd サービスとして設定するのは意味があるでしょうか?
答え1
あなたが説明したように入力に依存するプログラムは、次のような端末マルチプレクサ内で起動する必要がありますtmux
(https://en.wikipedia.org/wiki/Tmux) またはscreen
(https://www.gnu.org/software/screen/)。ターミナル ウィンドウのテキスト ベース バージョンと考えてください。
を使っscreen my-program
て開始しますmy-program
。その後、切り離す仮想画面コンソールからキーの組み合わせCtrl- A Ctrl-を使用してD、開始したシェルに戻りますが、プログラムはバックグラウンドで実行され続けます。その後、 を使用してscreen -r
仮想コンソールに再接続できます。
screen (およびプログラム) は、プログラムが終了するかサーバーが再起動されるまで実行され続けます。
tmux
非常に似ていますが、オプションと機能が多く、使用するキーボードショートカットが異なります。
答え2
スクリプトをバックグラウンドで実行し続けるには、 nohup: を使用しますnohup scriptcommand &
。理想的には、スクリプトには入力を求めないオプションがあります。何らかの理由でそれがオプションでない場合は、期待する'y'を入力するために使用できます。
スクリプト用のsystemdサービスを作成すると、システムの再起動時にスクリプトが起動されるようになります。また、Restart=always
サービスが終了または強制終了された場合にsystemdファイルでサービスを再起動することもできます。systemdのドキュメントに詳しい情報があります。