Здесь есть некоторая путаница по поводу "только один раз".
NSTask
создает новый процесс, это тот процесс, который может быть запущен только один раз; Вы можете использовать NSTask
, чтобы создать столько разных процессов, сколько захотите, и каждый из них может запускаться один раз. И каждый из этих разностных процессов, которые вы создаете, может выполнять разные или одинаковые двоичные файлы - поэтому, если вы хотите создать много процессов, каждый из которых выполняет /bin/bash
, вы можете.
Так что для каждого из ваших скриптов создайте новый NSTask
и запустите его.
Примечание: метод класса launchedTaskWithLaunchPath:arguments
создает NSTask
и запускает процесс. Вы также можете создать NSTask
с помощью [NSTask new]
(или [[NSTask alloc] init]
), установить его параметры, а затем запустить его.
Примечание: из вашего комментария к другому ответу использование [NSTask new]
или [[NSTask alloc] init]
означает нормальное , и вы делаете это независимо от того, используете ли вы сборщик мусора, автоматический подсчет ссылок или ручной подсчет ссылок. Это методы retain
, release
и autorelease
, которые вы не используете для сборки мусора и автоматического подсчета ссылок.
Ответ на комментарий
user1168440 показал более общий метод вызова NSTask
, но в качестве подтверждения использования метода класса здесь выполняются два сценария оболочки. Сначала создайте два сценария в /tmp
:
tmp $ cat script1.sh
#!/bin/bash
echo `date -u` script one >>/tmp/script.txt
tmp $ cat script2.sh
#!/bin/bash
echo `date -u` script two >>/tmp/script.txt
И тривиальное приложение Obj-C:
#import "TasksAppDelegate.h"
@implementation TasksAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSTask launchedTaskWithLaunchPath:@"/bin/bash" arguments:[NSArray arrayWithObject:@"/tmp/script1.sh"]];
[NSTask launchedTaskWithLaunchPath:@"/bin/bash" arguments:[NSArray arrayWithObject: @"/tmp/script2.sh"]];
}
@end
Запустите в Xcode и проверьте результат:
tmp $ cat script.txt
Sat Mar 10 05:12:43 UTC 2012 script two
Sat Mar 10 05:12:43 UTC 2012 script one
Обе задачи были выполнены, так что это не то, что остановило работу вашего кода. Может быть, один из ваших сценариев оболочки, необходимый для чтения из стандартного ввода, завершился с ошибкой и, таким образом, вообще не работал?
В общем случае метод, который устанавливает канал, является выводом захвата (и может обеспечить ввод), является гораздо лучшим способом использования NSTask
, но launchedTaskWithLaunchPath:arguments
работает нормально, если захват вывода (или ввод ввода) не требуется.