前提
先日『LinuxでWindowsアプリケーションを動かす』という記事を書きました
こちらの記事はLinuxで原神をプレイしたいというところから発展したものでした
原神のインストールは上記の記事にある流れで同様にインストールができます
原神を起動するのに都度Steamを立ち上げたくない
こちら本題となります
シェルスクリプトにまとめたい
シェルスクリプト叩いて実行できれば楽じゃないですか?
やりましょう
実行ファイルを調べる
まず動かしてみるのは当然Steamに登録してあるパスです
こいつを叩いてみます
動かないですね……
ただこの長いコマンドによって起動することはわかりました
環境変数が必要
結論としては環境変数をセットしてやる必要があります
一度Steamから起動して動いてるプロセスが持っている環境変数を調べられればそいつをexportしてから実行することで動作することが期待されます
丁度こちらに特定のプロセスが持つ環境変数を取得する方法が記載されてますね👀
プロセスIDを特定する
ps auxf | grep "Genshin Impact"
これで一番親になってるプロセスIDを確認しましょう
今回 2645969
となってました
また、そのプロセスのコマンドラインも今一度確認しておきましょう
さて、上記記事にあるスクリプトを利用して環境変数を確認してみます
process-env 2645969
何やら色々出てきます
原神を起動する際に不要なものもありますが、とりあえず全部使いましょう
シェルスクリプトにまとめる
ここまでで実行ファイルのパスと環境変数がわかりました
これを愚直にシェルスクリプトにまとめましょう
#!/bin/bash
export 環境変数
export 環境変数
.
.
.
export 環境変数
/path/to/bootcmd
実行権限を付与してターミナルから実行してみると原神が起動するようになったかと思います
いろいろとめんどい
わかります
面倒ですよね
なのでゲームを起動するシェルスクリプトを吐き出すシェルスクリプトを用意いたしました
コマンドライン引数にはプロセスを特定するための文字列を指定します
"プロセスIDを特定する" でgrepした文字列で良いでしょう
#!/bin/bash
echo "#!/bin/bash"
echo
ROOTPROCESS=$(ps auxf | grep "$(pgrep -f "$1")" | head -n1 | awk '{ print $2 }')
process-env $ROOTPROCESS | while read line; do
echo "export ${line}"
done
CMDLINE="$(ps aux | grep ${ROOTPROCESS} | grep -v grep | awk '{ for (i=13; i<=NF; i++) printf("%s ", $i) }')"
echo "$(cat <<SHELLSCRIPT
function signal() {
kill -KILL \$(ps aux | grep "$1" | grep -v grep | awk '{ print \$2 }')
}
trap "signal" SIGINT SIGHUP SIGKILL SIGTERM
${CMDLINE} > /dev/null 2>&1
SHELLSCRIPT
)"
まずシェバンを出力します
次にprocess-envを用いて取得した環境変数を反映させるためにexportする形で出力します
起動するためのコマンドラインを取得します
次にヒアドキュメントを使ってなにやらやっています
これはちょっと込み入った記述をするのに都度echoするのが面倒だったのでこうしてます
まずシグナルを受けとった際に実行する関数を定義します
これはプログラムを終了させるのに利用します
次にtrapを用いてシグナルを受け取った際に関数が呼び出されるようにします
ゲームのウィンドウを閉じるだけだとプロセスが完全には終了しませんでした
こうしておくとターミナルから起動していればCtrl+CでKILLできますし、そうでなければ適宜起動したシェルスクリプトのプロセスに対してKILLしてやればいい感じにゲームのプロセスも死ぬようになります
最後に先程抽出したコマンドラインを出力します
一度Steamでゲームを起動した状態でこのスクリプトを実行して結果をリダイレクトし、そのファイルに実行権限を付与して実行します
キタ―――(゚∀゚)―――― !!
ちなみにゲームパッドも認識してコントローラー握りしめて遊んでます
それでは良いゲームライフを