2015-01-01 3 views
0

Мне нужно убить Mac-процесс, но перед этим мне нужно проверить, действительно ли он существует или нет?Как проверить процесс Mac существует по имени процесса

Я попытался использовать метод C++ system("killall process_name");, чтобы убить процесс по имени.

Но я думаю, что я должен также проверить, действительно ли процесс работает или нет. Может кто-нибудь, пожалуйста, дайте мне знать, как это можно сделать?

+2

Что делать, если он заканчивается после того, как вы проверяете, но, прежде чем убить его? «Делайте, или нет, нет проверки». –

+0

Вы должны использовать для этого сигналы вместо 'system'. И кроме того, не имеет значения, существует ли он или нет, если он это сделает, он получит сигнал от 'killall', если он этого не сделает, ничего не произойдет. –

+0

@Alan Stokes Что делать, если процесс находился в состоянии «не работает» в течение долгого времени и продолжает оставаться в состоянии «не работает». Потому что система() не исключается, поэтому я не могу использовать try- блок блокировки. Есть ли способ лучше? –

ответ

2

Вы можете безопасно использовать killall - тот, который вы уже используете. Это безвредно, даже если процесс не существует.

Поскольку вы отметили Objective-C, я предполагаю, что у вас все в порядке с какао-решениями. Это еще один простой способ убить процесс, если у вас есть имя процесса в руке. Он использует сценарий Apple. Здесь вам не нужно проверять, работает ли он или нет.

NSString *processName = @"Microsoft Outlook"; 
NSString *scriptSource = [NSString stringWithFormat:@"tell application \"%@\" to quit",processName]; 
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:scriptSource]; 
[script executeAndReturnError:nil]; 
+0

wow..хороший один..очень полезный..thanks –

2
BOOL processIsRunning = system("ps -Ac | grep 'AProcessName' > /dev/null") == 0; 

Или, если вы хотите, чтобы проверить строку в частности:

BOOL processIsRunning = system("ps -ef | grep 'AUniqueString' | grep -iv grep > /dev/null") == 0;