Der Mac-Befehl lsof findet alle Prozesse für alle Benutzer

1020
Hovestar

Vor einiger Zeit bat mich mein Lehrer, ein Skript zu erstellen, das Minecraft bei jedem Auftauchen töten würde. Es hat funktioniert, wenn der Benutzer es selbst ausgeführt hat, aber auf Root-Ebene nicht.

Gibt es einen ähnlichen Befehl wie lsofalle gefundenen Prozesse, nicht nur diejenigen des Benutzers, der lsof aufgerufen hat? Ich habe die Manpage gelesen, aber ich verstehe sie nicht ganz. Gibt es einen lsofBefehl, der jeden einzelnen Prozess abdeckt, nicht nur die Benutzer?

Dies ist das Skript, das nur für Macs entwickelt wurde:

#!/usr/bin/env python import os from time import sleep  while True: os.system("lsof | grep minecraft | cut -c 11-16 >mine.txt") f=open("mine.txt") l = f.readline() if len(l) > 0: os.system("kill "+l) f.close() os.system("echo > mine.txt") sleep(15) 
2
Hey, könnte ich dieses Skript in die Finger bekommen? Ich könnte es benutzen Ich möchte auch seine Fähigkeiten erweitern, damit Quellcode schön wäre. Griffin vor 11 Jahren 0
@ Griffin Klar werde ich die Frage bearbeiten. Es ist ziemlich einfach. Hovestar vor 11 Jahren 1
Eigentlich ist das eine noch bessere Idee. Wenn Sie ihnen die Quelle zeigen, können Sie besser verstehen, was geändert werden soll. Leider kann ich nicht helfen, weil ich es nicht weiß, aber andere, die es tun, könnten es nützlich finden. Griffin vor 11 Jahren 0
Warum benutzen Sie "lsof"? Es ist so konzipiert, offene Dateien aufzulisten. Ich denke, es wäre besser, etwas wie "ps" zu verwenden. Und was die Auflistung der Prozesse aller Benutzer angeht ... wenn Speicher dient, ist dies unmöglich, da dies ein potenzielles Sicherheitsproblem darstellt nc4pk vor 11 Jahren 1
:( Ich kenne keinen Python. Wie Sie das in C ++ machen Griffin vor 11 Jahren 0
Ich kenne ein wenig ANSII C, aber nicht C ++. Ich werde es schnell herausfinden und mich dann mit Ihnen in Verbindung setzen, aber wenn der Benutzer den Code nicht selbst aktiviert, ist er an dieser Stelle nutzlos. Hovestar vor 11 Jahren 0
Ich konnte also keine Möglichkeit finden, Terminalbefehle in c ++ auszuführen, aber wenn Sie könnten, wird der Befehl lsof | gesendet grep minecraft | cut -c 11-16> mine.txt liest dann aus mine.txt und erhält die erste Zeile, die die PID ist, dann tötet sie diese PID. Hovestar vor 11 Jahren 0

2 Antworten auf die Frage

2
user495470

This prints the names of all processes:

ps -axco comm | sed 1d 
  • -a: all users (like root when run as user and user when run as root)
  • -x: include processes without a controlling terminal
  • -o comm: output only the command column
  • -c: use command names instead of paths in the command column
  • sed 1d: delete the first line (COMM)

If you only want to quit Minecraft, you could run a shell script like this (or just killall minecraft with launchd or cron):

while sleep 5; do killall minecraft 2> /dev/null; done 
1
kenorb

Ein ähnlicher Befehl lsofdurchsucht alle Prozesse, nicht nur diejenigen des aufgerufenen Benutzerslsof

pgrep -f minecraft 

Wo minecraftist der Prozess zu finden? Der Befehl gibt eine Liste der PIDs zurück.

Hier ist der Kill-Befehl (Shell-Syntax):

kill $(pgrep -f minecraft) 

Anstelle von Python verwenden Sie hier einen einfachen Shell-Befehl, um dasselbe zu erreichen:

while true; do echo kill $(pgrep -f minecraft) 2> /dev/null; sleep 15; done