1 回答
TA贡献1830条经验 获得超9个赞
我终于有了一个解决方案,使用管道而不是 Popen 解决方案。
在我看来,Popen 不是运行 bash 脚本的最佳解决方案,如如何使用 Python Popen 执行多个参数中所述?,SiHa 在评论中发送的链接(谢谢!):
“但是,使用 Python 作为许多系统命令的包装器并不是一个好主意。至少,您应该将命令分解为单独的 Popen,以便可以充分处理非零退出。实际上,这script 似乎更适合作为 shell 脚本。”。
所以我提出了解决方案,使用了一个 fifo 文件:
首先,在所需目录(例如,/samba/terraria/config)中创建一个用作管道的 fifo:
mkfifo cmdOutput
*/samba/terraria - 这是我创建的目录,以便使用另一台计算机轻松编辑脚本、保存和加载地图到服务器,与 samba 共享(https://linuxize.com/post/how-to -install-and-configure-samba-on-ubuntu-18-04/ )
然后我创建一个 python 脚本来读取屏幕输出,然后写入管道文件(我知道,可能还有其他方法):
import shlex, os
outputFile = os.open("/samba/terraria/config/cmdOutput", os.O_WRONLY )
print("python script has started!")
while 1:
line = input()
print(line)
cmdPosition = line.find("&")
if( cmdPosition != -1 ):
cmd = slice(cmdPosition+1,len(line))
cmdText = line[cmd]
os.write(outputFile, bytes( cmdText + "\r\r", 'utf-8'))
os.write(outputFile, bytes("say Command executed!!!\r\r", 'utf-8'))
然后我编辑 terraria.service 文件以调用此脚本,从 terrariaServer 通过管道传输,并将错误重定向到另一个文件:
ExecStart=/usr/bin/screen -dmS terraria /bin/bash -c "/opt/terraria/TerrariaServer.bin.x86_64 -config /samba/terraria/config/serverconfig.txt < /samba/terraria/config/cmdOutput 2>/samba/terraria/config/errorLog.txt | python3 /samba/terraria/scripts/allowCommands.py"
*/samba/terraria/scripts/allowCommands.py - 我的脚本在哪里。
**/samba/terraria/config/errorLog.txt - 将错误日志保存在文件中。
现在我可以发送命令,比如“中午”或“黎明”,这样我就可以更改游戏时间、保存世界并在老板打架之前用 samba 服务器备份它,如果我有时间可以做其他事情 XD,并拥有终端显示服务器正在发生的事情。
添加回答
举报