Итерировать по результатам pgrep - PullRequest
0 голосов
/ 17 января 2019

Контекст: Dropbox периодически забирает 100% моего процессора, делая мой ноутбук непригодным для использования. Инструмент cputhrottle позволяет ограничить количество ЦП, которое использует любой данный процесс (PID).

На самом деле Dropbox имеет несколько PID на моей машине, и я бы хотел использовать bash для их циклического перемещения.

Самое близкое, что я получил к одной строке:

pgrep -f Dropbox | xargs -I{} cputhrottle {} 30 &

У этого есть две проблемы:

  1. cputhrottle выдает ошибку (чего не происходит при непосредственном вызове): 1libc++abi.dylib: terminating with uncaught exception of type Process::ManipulatorException: Error on task_for_pid of pid 720, res = 5

  2. Фоновое отображение процессов, похоже, не работает (первый сбой, а процесс все еще находится на переднем плане. Я не уверен, является ли это следствием 1 или другой проблемой.

Я не уверен, должен ли я отказаться от однострочника, но я не уверен, как заставить работать следующую петлю for:

for i in $(pgrep -f Dropbox); do 
    cputhrottle $i 30 &
done

, что дает syntax error near unexpected token ';'

1 Ответ

0 голосов
/ 17 января 2019

Apple изменила свою модель безопасности ОС таким образом, что нарушает функциональность task_for_pid, на которую опирается cputhrottle. Кажется, что изменение нарушает cputhrottle, и я подозреваю, что cputhrottle на самом деле не работает, когда вы вызываете его вручную.

Похоже, что Apple действительно не хочет использовать task_for_pid, поскольку на данный момент она полностью не документирована в документах Apple API, и попытка найти ссылку на нее в любой документации в любом месте также очень трудна. Я понятия не имею, почему автор cputhrottle решил использовать эту конкретную функцию для построения своей программы.

Если вы действительно хотите, вы можете перестроить cputhrottle, чтобы получить правильные разрешения безопасности.

Другое решение здесь - найти другую программу для использования. Может быть, просто использовать встроенную nice функциональность?

Ссылки на изменения безопасности OS API:

http://os -tres.net / блог / 2010/02/17 / MAC-OS-X-и-задача-для-Pid-маха-вызов / https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/RuntimeProtections/RuntimeProtections.html

Источник для ловушки task_for_pid Маха, если вам интересно:

https://github.com/apple/darwin-xnu/blob/a449c6a3b8014d9406c2ddbdc81795da24aa7443/bsd/vm/vm_unix.c#L783-L929

Чтобы лучше объяснить сообщение об ошибке, которое вы также видите, код выхода 5 на самом деле KERN_FAILURE, что является универсальным универсальным сигналом, указывающим, что вызываемая функция ядра не удалась. В этом случае, вероятно, из-за неправильных разрешений безопасности.

https://github.com/apple/darwin-xnu/blob/0a798f6738bc1db01281fc08ae024145e84df927/osfmk/mach/kern_return.h#L94-L96

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...