запустить две команды в отключенном экране

Для начала вам нужно понять, что сценарии оболочки - это просто удобное сокращение для самостоятельного ввода команд. Каждый раз, когда вы или сценарий вызывает grep , вы не вызываете встроенный примитив; вы просите оболочку найти программу с именем grep и запустить ее как новый процесс. Создание нового процесса и запуск его первого бита кода, вероятно, наименее предсказуемая вещь, которую вы можете сделать в любой среде, которая не настроена на предсказуемость. Так будет с любым компьютером, работающим под управлением операционной системы, не работающей в режиме реального времени. Подробности того, почему это так, будет кормом для половины семестра занятий по операционным системам, но я могу привести вам один или два примера, которые проиллюстрируют, почему ваши усилия по точному измерению полного выполнения программы не дадут стабильных результатов, которые вы думаете. им следует.

Первое, что делает большинство программ при первом обращении к ЦП, - это генерирует ошибку страницы, чтобы можно было загрузить код первой страницы. Если дюжина других программ выполняет ввод-вывод на том же устройстве, на котором находится код, время загрузки страниц вашей программы зависит от того, как далеко назад находятся запросы в очереди устройства. Вы можете подумать, что ваша тестовая программа работает в одиночку, но я готов поспорить, что это не так.(Также стоит упомянуть, что grep - это программа с интенсивным вводом-выводом, поэтому время чтения ввода зависит от многих из тех же причин.)

Многие операционные системы принимают меры, чтобы избежать одновременное наличие избыточных копий одного и того же резидентного кода как способ сократить потребление памяти и повысить производительность. Это означает, что если вы запустите grep и есть другой grep , работающий с уже размещенной первой страницей, вышеупомянутая ошибка страницы никогда не произойдет, и все эти усилия будут пропущены. Это сокращает время работы настенных часов.

К тому времени, когда вы дойдете до выполнения timeit в MATLAB, процесс MATLAB уже запущен и, вероятно, перепрыгнул через необходимые обручи, чтобы загрузить вашу функцию, прежде чем вызывать ее повторно. Вызов происходит довольно быстро, потому что это просто внутренний вызов. Хотя существует также множество факторов, которые могут повлиять на продолжительность выполнения timeit , они в равной степени применимы ко всему остальному.

Тем не менее, я думаю, что настоящая причина того, что вы видите, заключается в том, что сравниваются не яблоки с яблоками.

Unix time (1) запускает тестируемую программу ровно один раз, тогда как MATLAB timeit умножает на функцию, которую вы тестируете много раз, и возвращает медианное значение результатов. В документации предлагается не использовать вместе функции timeit и tic и toc , что указывает на то, что последние используются первыми.В документации для tic и toc рекомендуется, чтобы если у вас есть код, который выполняется менее чем за 0,1 секунды, вы запускаете его много раз и вычисляете среднее значение. Из этого я понимаю, что время MATLAB на два порядка менее точное, чем время time (1) , и предназначено больше для проверки того, сколько времени вы можете сэкономить на длительно выполняемых функциях. . Это, а также комбинация усреднения и медианы, при наличии достаточного количества выборок, приводят к большому количеству вариаций в довольно стабильный результат.

6
13.07.2017, 00:31
2 ответа

Работает, если указать bash -c

screen -dm bash -c 'command1; command2;'

Пользовательmeuhпредоставил это решение в комментариях, спасибо.

14
27.01.2020, 20:25

Поместите всю последовательность команд, которые вы отправляете на screen, в кавычки; в противном случае первая точка с запятой завершает эту команду и отправляет остаток в оболочку, в которой вы вызываетеscreen:

screen -dm 'wget http://www.example.com/file.zip -O temp/file.zip; mv temp/file.zip downloads/file.zip'

Тем не менее, было бы целесообразно перемещать файл только в том случае, если загрузка прошла успешно:

screen -dm 'if wget http://www.example.com/file.zip -O temp/file.zip; then mv temp/file.zip downloads/file.zip; fi'
2
27.01.2020, 20:25

Теги

Похожие вопросы