Команда Mac lsof находит все процессы для всех пользователей

959
Hovestar

Некоторое время назад мой учитель попросил меня создать сценарий, который убивал бы Майнкрафт в любое время. Это сработало, когда пользователь сам запустил его, но не получилось, если оно было на уровне root.

Есть ли команда, похожая на lsofту, которая обнаружила все процессы, а не только те, которые выполнял пользователь, вызвавший lsof? Я прочитал справочную страницу, но я не совсем понимаю это. Есть ли lsofкоманда, которая получит каждый процесс, а не только пользователя?

Это скрипт, предназначенный только для Mac:

#!/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
Эй, могу ли я получить этот сценарий? Я мог бы использовать это. Я также хотел бы расширить его возможности, чтобы исходный код был бы хорош. Griffin 11 лет назад 0
@ Гриффин Конечно, я отредактирую вопрос. Это довольно просто. Hovestar 11 лет назад 1
На самом деле это даже лучшая идея. Показ им источника может помочь им лучше понять, что нужно изменить. К сожалению, я не могу помочь, потому что я не знаю, но другие, которые делают, могли бы найти это полезным. Griffin 11 лет назад 0
почему вы используете `lsof`? это разработано, чтобы перечислить открытые файлы. я думаю, что было бы лучше использовать что-то вроде `ps`. и что касается перечисления процессов всех пользователей ... если память служит, это невозможно, так как это потенциальная проблема безопасности nc4pk 11 лет назад 1
:( Я не знаю Python. Как вы делаете в C ++ Griffin 11 лет назад 0
Я немного знаю ANSII C, но не C ++. Я разберусь с этим очень быстро, а потом вернусь к вам, но если пользователь сам не активирует код, он бесполезен на данном этапе. Hovestar 11 лет назад 0
Поэтому я не смог найти способ заставить команды терминала выполнять c ++, но если бы вы могли, он отправил команду lsof | grep minecraft | cut -c 11-16> mine.txt, затем он читает из mine.txt и получает первую строку, которая является pid, затем убивает этот pid. Hovestar 11 лет назад 0

2 ответа на вопрос

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

команда, подобная lsofтой, которая сканирует все процессы, а не только те, которые вызвал пользовательlsof

pgrep -f minecraft 

Где minecraftпроцесс, чтобы найти. Команда возвращает список PID.

Вот команда kill (синтаксис оболочки):

kill $(pgrep -f minecraft) 

Вместо использования Python, вот простая команда оболочки для достижения того же:

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