【问题标题】:Operation not permitted when executing 'killall' with Swift使用 Swift 执行“killall”时不允许操作
【发布时间】:2018-09-07 17:34:54
【问题描述】:

我正在尝试创建一个菜单栏应用程序来隐藏桌面图标,并希望主要是为了了解有关 Swift 的更多信息,但由于某种原因我无法让它工作。当我运行该程序并单击其中一个菜单项时,没有任何反应,并且我在控制台中收到以下警告:

killall: warning: kill -TERM 15175: Operation not permitted

其他命令有效,但我在“killall”上尝试的任何变体都会吐出类似上面的内容。目前我的代码如下所示:

@discardableResult
func killStuff(_ args: String...) -> Int32 {
    let task = Process()
    let pipe = Pipe()

    task.launchPath = "/usr/bin/killall"
    task.arguments = args
    task.standardOutput = pipe
    task.standardError = pipe
    task.launch()
    task.waitUntilExit()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    if let output = String(data: data, encoding: .utf8) {
        print(output)
    }

    return task.terminationStatus
}

我已经尝试了很多关于herehere 和我在 Google 上找到的公认解决方案的变体,但我一直收到相同的“不允许操作”。当我在 Xcode 操场上运行相同的代码时,它工作得很好。

提前致谢!

【问题讨论】:

  • 您是否尝试过使用sudo
  • @kilojoules 是的,当我使用 killStuff 函数尝试它时,它具有相同的消息,然后当我在第一个链接中使用 shell 函数尝试它时,我看到它说“env: sudo: Operation不允许”
  • 您不能使用沙盒应用程序这样做。
  • @ElTomato 哦,好的,谢谢。我从我的构建设置中删除了权利文件并且它有效。本着良好编程实践的精神,就这样删除它是否可以接受?

标签: swift xcode macos terminal


【解决方案1】:

如果您将其创建为自己的本地应用程序,则可以打开您的权利文件并将“应用程序沙盒”更改为 NO。我不建议对生产应用程序这样做。

【讨论】:

    【解决方案2】:

    Mac 应用程序(如 iOS 应用程序)默认情况下是沙盒化的,这意味着它们对系统资源的访问权限非常有限。例如,它们只允许读取和写入少量沙盒目录,绝对不允许从usr/bin 读取/写入/执行,也不允许您启动进程。

    我记得,通过删除您的权利文件,您正在构建一个没有沙盒化的应用程序。您可以从 Xcode 运行它,但需要更改系统设置才能从 finder 运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2012-07-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多