新しいターミナルウィンドウを開き、ゲームサーバーを起動する変数を実行し、新しいウィンドウの出力を記録する短いスクリプトを作成しようとしています。
サーバーはまったく役に立たないメッセージをたくさんコンソールにスパムとして送信しているので、ウィンドウを隠すために-qも追加したいと思います。
私の究極の目標は、grepを使用して「Steamサーバーに接続されている」ログを表示し、それをメインコンソールに報告することです。現在私は以下を持っています:
$server="$game_path/server_executable"
gnome-terminal -- $server
gnome-terminalに追加すると、コードが破損します。gnome-terminal -- "$server 2>&1 | tee server.log"
GNOMEターミナルラインを試してみましたが、壊れていました。私もそうしてみましたがgnome-terminal -- "@server >> server.log"
失敗しました。サーバーコマンドを実行するために新しいシェルを取得する方法に対する答えはわかりません。そして出力をログファイルにエクスポートします。
Debian 12 で実行しています。
答え1
より良いアプローチは、ターミナルウィンドウが閉じてもサービスが実行され続けるようにするか、screen
同じものを使用することです。tmux
しかし、それはあなたが尋ねたものではありません...
gnome-terminal -- "$server 2>&1 | tee server.log"
これはほぼ正確です。ドキュメントを見てみましょう(man gnome-terminal
)
gnome-terminal [OPTION…] [-- PROGRAM [ARG…]]
そしてやや混乱して、
--command, -e=COMMAND
このオプションの引数をシェルと同じ方法でプログラムと引数に分割し、結果のコマンドラインを端末内で実行します。このオプションは廃止されました。代わりに--
オプションを終了し、その後に実行されるプログラムと引数を入れます。たとえば、使用する代わりにgnome-terminal -e "python3 -q"
使用することを好みますgnome-terminal -- python3 -q
。
今まではそんなに良くなった。しかし、
シェルを介して実行されないことに注意してください
COMMAND
。単語に分割され、プログラムとして実行されます。シェル構文が必要な場合は、次の形式を使用します。gnome-terminal -- sh -c '...'
最後の段落が重要です。|
これを解釈するには、シェルを直接呼び出す必要があり、使用できません。>
gnome-terminal
$server="$game_path/server_executable"
gnome-terminal -- sh -c "$server 2>&1 | tee server.log"
screen
個人的には、次のようにまたはなしで使用することを好みますgnome-terminal
。
gnome-terminal -- screen sh -c 'game_path/server_executable 2>&1 | tee server.log'
それとも、その部分を本当に望んでいないgnome-terminal
だけでゲームサーバーを起動する方法だけであれば、
screen -md sh -c 'game_path/server_executable 2>&1 | tee server.log'
多くの助けU&Lからセッションを操作するために使用されますscreen
。私の答え到着プロセスを一時停止し、Ubuntuの別の画面から前景に戻ります。