jjzjj

c++ - 在用户上下文中从守护进程启动代理

coder 2024-02-26 原文

我有一个在 Mac OSX 10.6 机器的登录上下文中运行的启动守护程序。我想从该代理为每个用户启动一个代理,并让该代理在用户的登录上下文中运行。但是,我需要非常小心地控制代理应用程序的精确参数,这就是为什么我不能使用 launchd 代理,就像我在守护程序中使用的那样。

如何创建在登录用户的上下文中运行的进程?我已经验证了 seteuidsetuid 调用,但它们不会更改代理应用程序的执行上下文。

我知道这不是推荐的 Apple 做事方式,但我真的没有选择 - 守护程序应用程序的设计非常不灵活(它必须在许多不同的系统上运行).是否有一种解决方法允许我从在登录上下文中运行的守护程序在已登录用户的 GUI 上下文中运行应用程序?

我正在使用 C++、Carbon 和 Cocoa。

最佳答案

使用 launchd 代理。所有其他方法都会用大量无用的细节和隐藏的技巧让您大吃一惊。一般来说,这是一项非常复杂的任务,有很多极端情况,很难正确实现。启动代理将使您能够专注于您的任务并节省大量时间。

最好的解决方案是重写代理而不是使用命令行,而是连接到 launchd 守护进程并询问适当的选项/设置。

如果不可能或很难,您可以编写包装器启动的代理程序,它将开始连接到守护程序,询问选项,然后使用适当的命令行启动原始代理程序。

如果您认为实现“连接到守护进程”机制太难了……也许是这样,但它比在其他 session 中从守护进程启动代理要容易得多(当正确实现不同的极端情况支持时)。

但是如果你真的-真的-无关紧要-以肮脏的方式想要它,您可以玩“launchctl bsexec”。一些有效的例子: Starting/stopping a launchd agent for all users with GUI sessions (而不是“launchctl load”,它可以在 session 上下文中启动任何可执行文件)。

一些更新。

“使用 launchctl bsexec”是指类似的意思:

ps 辅助 | grep 登录窗口 | grep 用户 | awk '{ system("sudo launchctl bsexec "$2"sudo -u user/Applications/TextEdit.app/Contents/MacOS/TextEdit") }'

在您想要的 session 中找到一些应用程序,获取其 PID 并调用“launchctl bsexec”以在同一 session 中运行您想要的应用程序。上面的示例将在登录的“用户” session 中启动 TextEdit,即使该行是在另一个登录用户帐户下或从服务中执行的。

但我在 Lion 上测试过它 - 它不起作用。它仅适用于 Leopards (10.5/10.6) 对我来说。 我想说的是——不使用发射剂只会让你的屁股持续疼痛,除此之外别无他法。在经历了十几次这样的事情之后,我们完全转向了启动代理,现在很高兴 :)

关于c++ - 在用户上下文中从守护进程启动代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515314/

有关c++ - 在用户上下文中从守护进程启动代理的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  7. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  8. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  9. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  10. ruby - 在 Ruby 中,在类方法的上下文中,什么是实例变量和类变量? - 2

    如果我有以下一段Ruby代码:classBlahdefself.bleh@blih="Hello"@@bloh="World"endend@blih和@@bloh到底是什么?@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@@bloh是Blah的类Class中的一个变量? 最佳答案 人们似乎忽略了该方法是类方法。@blih将是常量Bleh的类Class实例的实例变量。因此:irb(main):001:0>classBlehirb(main):002:1>defself.blehirb

随机推荐