我有一个Kubernetes集群,其中有一个部署工作负载资源和一个挂载的存储(持久卷声明)。部署资源运行一个包含Minecraft服务器的容器,其中包含文件server.properties
。
通缉行为
我想从C#应用程序中使用kubectl exec
和sed
命令更改该文件的值:
kubectl exec deployment/test-mc -- sed -i 's|^gamemode=.*|gamemode=creative|' server.properties
字符串
如果我从终端(而不是从应用程序)启动这个命令,它工作得很好,文件会用新值更新。检查我是否使用了kubectl exec deployment/test-mc -- cat server.properties
。
问题
当我尝试从C#应用程序启动相同的命令时,它不工作。这是我用来运行命令的代码:
private string ExecCommand(string serverName, string command)
{
var processStartInfo = new ProcessStartInfo()
{
FileName = "kubectl",
Arguments = $"exec deployment/{serverName} -- {command}",
RedirectStandardOutput = true,
UseShellExecute = false
};
var process = new Process()
{
StartInfo = processStartInfo
};
process.Start();
var commandOutput = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return commandOutput;
}
public void ChangeGamemode(string serverName, string newGamemode)
{
Console.WriteLine($"Command: touch test.txt");
var commandOutput = ExecCommand(serverName, $"sed -i 's|^gamemode=.*|gamemode={newGamemode}|' server.properties");
Console.WriteLine($"Output: {commandOutput}");
}
型
但是当我使用kubectl exec deployment/test-mc -- cat server.properties
检查server.properties
的内容时,该值仍然没有改变。
更多信息
我确信我可以访问部署资源,因为我尝试从C#应用程序创建文件,并且成功了:
// From C# Application
ExecCommand(serverName, "touch test.txt");
型
来自终端的文件列表:
> kubectl exec deployment/test-mc -- ls -la
total 46748
[...]
-rw-rw-rw- 1 minecraft minecraft 1313 Jul 3 10:46 server.properties
-rw-r--r-- 1 root root 0 Jul 3 11:23 test.txt
[...]
型
任何帮助将不胜感激:)
2条答案
按热度按时间jgwigjjp1#
这一行:
字符串
你是不是忘了把
$
放在"sed -i 's|^gamemode=.*|gamemode={newGamemode}|' server.properties"
前面?它应该是:
型
ibrsph3r2#
更新:我仍然没有弄清楚为什么它不工作,但设法找到了一个解决方案。
解决方案
我创建了一个shell脚本,它可以完成我需要的任务:更新
server.properties
文件的属性:字符串
我从C#应用程序调用它,传递我需要的值,如下所示:
型
这样,文件就会得到更新,因为它应该:)