Linux(CentOS)を実行しているEC2インスタンス(AWS)でMinecraftサーバーを実行しています。minecraft.service
システムプロセスを次のように変更しました。
ExecStart=python3 run_server.py
このPythonスクリプトは、run.json
サーバーjar名、WebフックURL、役割ID、およびjvmパラメータで埋められたファイルを抽出します。次のようになります。
{
"server_jar":"server.jar",
"jvm_args":"-Xms1G -Xmx4G",
"webhook_url":"your_url_here",
"role_id":"your_role_here"
}
sudo systemctl start minecraft
後で実行すると、sudo systemctl status minecraft
次のエラーが発生します。
with Popen(*popenargs, **kwargs) as p:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/subprocess.py", line 1026, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/usr/local/lib/python3.12/subprocess.py", line 1953, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'java -Xmx3G -Xms3G -jar server.jar nogui'
答え1
より多くのPythonコードを表示するのに役立ちますが、スペースを含む大きな文字列を単一のコマンド名で実行しようとしているため、このエラーが発生しているようです。代わりにリストを渡す必要があります。
間違い:
from subprocess import Popen, PIPE
process = Popen('java -Xmx3G -Xms3G -jar server.jar nogui', stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
正しい:
from subprocess import Popen, PIPE
process = Popen(
['java', '-Xmx3G', '-Xms3G', '-jar', 'server.jar', 'nogui'],
stdout=PIPE, stderr=PIPE
)
stdout, stderr = process.communicate()
長い文字列を複数のサブ部分に分割し、それらをリストに渡す方法を確認してください。
この回答はさらに役立つかもしれません。https://stackoverflow.com/questions/12605498/how-to-use-subprocess-popen-python