Я полагаю, что последняя часть вопроса больше относится к оболочке, нежели к ядру.(Саймон Урбанек ответил на часть multicore
лучше, чем кто-либо другой, так как он автор. :))
Если вы используете bash, вы можете найти PID самого последнего запущенного ребенкапроцесс в $!
.Вы можете объединить PID, а затем обязательно убить их, когда закроете R.
Если вы хотите быть действительно гонзо, вы можете сохранить родительский PID (т.е. вывод Sys.getpid()
) и дочерний PID вфайл и имеет демон очистки, который проверяет, существует ли родительский PID и, если нет, убивает сирот.Я не думаю, что будет так просто получить пакет с именем oRphanKilleR
на CRAN.
Вот пример добавления дочернего PID в файл:
system('(sleep 20) & echo $! >> ~/childPIDs.txt', wait = FALSE)
Вы можете изменить это, чтобы создать свою собственную команду оболочки и использовать команду R's tempfile()
для создания временного файла (хотя он исчезнет, когда экземпляр R завершится, если вы не приложите особых усилий для сохранения файла с помощью разрешений).
Для некоторых других умных идей, см. этот другой пост на SO .
Вы также можете создать цикл do while
в оболочке, который будет проверять,конкретный PID не существует.Пока оно есть, петля спит.Как только цикл завершается (поскольку PID больше не используется), сценарий убивает другой PID.
В принципе, я думаю, что ваше решение будет в сценариях оболочки, а не в R.