【发布时间】:2014-04-03 17:43:06
【问题描述】:
我有一个在 Ubuntu 10.04 上运行的 C++/Qt 程序。我正在使用带有 RSA 密钥的 x-windows (ssh -X) 运行远程应用程序,以防止密码对话框。 C++/Qt 程序允许用户调用 shell 脚本。 C++/Qt 程序必须以“gksudo -k”运行。
我遇到的问题是,当我从我的程序调用 shell 脚本时,如果我让远程应用程序运行,它会导致本地 C++/Qt 程序中的一个线程在退出时挂起。 (我希望能够让 ssh 会话保持运行,而不影响重新启动 C++/Qt 程序)
来自 C++ 代码:
try
{
system(script.c_str());
}
catch (exception& e)
{
throw;
}
catch ( ... )
{
ThrowException("Controller::LaunchScript()");
}
shell 脚本位于 /usr/local/bin,如下所示:
#!/bin/sh
ip_address='192.168.0.1'
remote_usr='xxusrxx'
remote_cmd='/usr/local/bin/remote_application'
cmd="ssh -X "$remote_usr"@"$ip_address" \""$remote_cmd"\""
eval $cmd &
有什么想法或建议吗?
更新 1:
当我查看使用“ps -ef”运行的进程时,会显示 C++/Qt 程序和启动器脚本,但会显示“ssh -X”。当我重新启动我的 C++/Qt 程序时,它会抛出一个错误“地址已在使用中”,就像我过去尝试启动应用程序而另一个实例已经在运行时一样。
更新 2:
我可能会在兔子洞里走得更远,但我现在正在研究 sudo+xauth 问题和解决方案。当前失败的尝试正在添加:
export XAUTHORITY=/home/xxusrxx/.Xauthority
sudo -E -u xxusrxx
此外,挂起的 C++/Qt 进程似乎已失效。一种可能性是在启动时跟踪应用程序“清理”失效的进程。
【问题讨论】:
-
在后台运行
$cmd是有道理的,但它可能会导致您的问题。试试这个作为快速测试,将 ssh args 修改为ssh -t -t -X ...。这适用于 shell 脚本中的这个问题(没有 C++ 包装程序)。祝你好运。 -
@shellter - 我尝试删除“&”并添加“-t -t”,但行为没有任何变化。
-
如果我的想法可行,那么
&应该没问题。它似乎不太可能起作用,但为了确定,将其放回并重新测试。对不起,ssh让大家头疼。我不会在这个上提供太多其他东西。祝你好运。 -
这个问题可能与某些守护程序/服务有关,这些守护程序/服务由 Qt 框架自动启动,但在您的应用程序启动时不会自动退出,并保持 X 通道打开。
-
@twalberg - 我该如何修复它或至少缩小哪个守护程序可能使其保持打开状态?