NSTask(): warning: Operation not permitted

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSTask(): warning: Operation not permitted

    Ich habe eine Funktion geschrieben, mit der ich den caffeinate-Prozess starte:

    Quellcode

    1. func caffeinateStart(){
    2. let task = NSTask()
    3. task.launchPath = "/usr/bin/caffeinate"
    4. task.arguments = ["caffeinate", "-u", "-t 86400"]
    5. task.launch()
    6. }


    stoppen möchte ich den Prozess mittels:

    Quellcode

    1. func caffeinateStop(){
    2. let killTask = NSTask()
    3. killTask.launchPath = "/usr/bin/killall"
    4. killTask.arguments = ["caffeinate"]
    5. killTask.launch()
    6. }


    ... das hat in den vergangenen Tagen auch hervorragend funktioniert. Nun plötzlich erhalte ich im Log aber folgende Fehlermeldung:
    killall: warning: kill -TERM 959: Operation not permitted

    Woran kann das liegen? ?(
  • Ich rate Dir dringend deine ganze Anwendung mit aktivierter Sandbox nochmal gründlich zu testen bevor Du es einreichst. Je nach Anwendung kann das ganz schön große Änderungen nach sich ziehen. Außerdem solltest Du die Anwendung auch bereits während der Entwicklung sandboxen und nicht erst kurz vor Release

    ciao

    gandhi

    P.S: Schönes neues Jahr an alle Mitlesenden :thumbsup:
  • mrtn.lxo schrieb:

    Woran kann das liegen?

    Es kann auch an einem caffeniate-Prozess liegen, der unter einer anderen User-Id läuft.

    BTW: Ich empfinde den Aufruf von Kommandozeilenprogrammen aus Apps immer als Flickschusterei. Insbesondere wenn es auch geeignete Boardmittel gibt. Dein Vorgehen ist ziemlich brutal, weil es alle entsprechenden Prozesse abschießt. Warum verwendest du nicht die Möglichkeiten von NSTask?
    „Meine Komplikation hatte eine Komplikation.“
  • Vielen Dank schonmal. Hier mein überarbeiteter Code:

    Quellcode

    1. let task = NSTask()
    2. func caffeinateStart(){
    3. task.launchPath = "/usr/bin/caffeinate"
    4. task.arguments = ["caffeinate", "-u", "-t 86400"]
    5. task.launch()
    6. }
    7. func caffeinateStop(){
    8. task.terminate()
    9. }
    Alles anzeigen


    ... das funktioniert grundsätzlich. Allerdings wechsle ich innerhalb der App häufiger hin- und her: Und sobald ich task einmal terminiert habe, kann ich ihn nicht erneut launchen ("task already launched").

    Gibt es einen Weg das zu umgehen?
  • mrtn.lxo schrieb:

    Gibt es einen Weg das zu umgehen?

    Ungefähr so:

    Quellcode

    1. var task : NSTask?
    2. func caffeinateStart(){
    3. task = NSTask()
    4. task?.launchPath = "/usr/bin/caffeinate"
    5. task?.arguments = ["caffeinate", "-u", "-t 86400"]
    6. task?.launch()
    7. }
    8. func caffeinateStop(){
    9. task?.terminate()
    10. task = nil
    11. }
    Alles anzeigen

    Praktischerweise kannst mit der Variable task dann überprüfen, ob schon ein Task läuft.
    „Meine Komplikation hatte eine Komplikation.“
  • und die ganzen fragezeichen sind kommentare des programmierers die aussagen dass er sich nicht sicher ist ob die zeile ok ist? ;)
    braucht man für swift ein eigenes tastaturlayout denn so viele "?" zu tippen mit deutschem layout stelle ich mir schon etwas unpraktisch vor.
    zur lesbarkeit trägt es wohl auch nicht unbedingt bei ;)
  • Großen Dank! Es funktioniert :)

    Vielleicht könntest du noch zwei Zeilen zur Erklärung schreiben? Ich hatte NSTask so verstanden, dass wenn einmal deklariert, dieser nur einmal ausgeführt werden kann. Ich verstehe deinen Code so, dass eine Variable vom Typ NSTask erstellt wird, innerhalb des Starts mit einem echten Task ausgestattet wird (nur warum Attribute etc. als Optionals, ich weiß zu diesem Zeitpunkt ja eigtl. dass der Task da ist?). Wenn ich mehrmals die Start-Funktion hintereinander aufrufe, würden dann weitere Tasks erstellt (und "stop" beendet quasi nur den Letzten, der Variable zugeordneten?)?