Я использую Windows MATLAB для запуска команд SSH, но время от времени команда SSH зависает на неопределенный срок, а затем и мой сценарий MATLAB (иногда при работе на ночь). Как я могу получить тайм-аут команды после определенного времени ожидания? Например, предположим, что я не хочу ждать более 3 секунд, пока команда SSH завершит выполнение, прежде чем сломать ее и двигаться дальше:
Я хотел бы сделать функцию sys_with_timeout , которую можно использовать следующим образом:
Я попробовал функцию тайм-аута из FEX, но, похоже, она не работает для команды system/SSH.
Комментарии (1)
Я видел подобные вопросы в прошлом, но я думаю, что ни один из них не имеет удовлетворительного ответа.
31.01.2023 20:21
Это коммюнике первоначально появилось на Symfony Station .
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим.
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете.
Matlab Tutorial | Matlab Tutorial for Beginners — 2021| Matlab GUI | Great Learning
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше.
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -.
Перейти к ответу Данный вопрос помечен как решенный
Ответы 2
Я не думаю, что команда system очень гибкая, и я не вижу способа сделать с ее помощью то, что вы хотите. Но мы можем использовать для этого функциональность Java, встроенную в MATLAB, согласно этому ответу Андре Карона.
Вот как вы будете ждать завершения процесса с тайм-аутом:
runtime = java.lang.Runtime.getRuntime(); process = runtime.exec(‘sleep 20’); process.waitFor(10, java.util.concurrent.TimeUnit.SECONDS); if process.isAlive() disp(«Done waiting for this. «) process.destroyForcibly(); end process.exitValue()
В примере мы запускаем команду оболочки sleep 20 , затем waitFor() ждем завершения программы, но не более 10 секунд. Мы опрашиваем, чтобы убедиться, что процесс все еще работает, и убиваем его, если это так. exitValue() возвращает статус, если вам это нужно.
Бегу sleep 5 вижу:
ans = 0
Бегу sleep 20 вижу:
Done waiting for this. ans = 137
Комментарии (2)
Спасибо, я никогда не знал о запуске команд Java из MATLAB. Это очень полезно. Я использовал разные части вашего ответа, чтобы создать нужную мне функцию, и опубликовал ее как новый ответ.
31.01.2023 22:11
Ответ принят как подходящий
function [status,cmdout] = sys_with_timeout(command,timeoutSeconds,streamOutput,errorOnTimeout) arguments command char timeoutSeconds = Inf streamOutput logical = true % display output as it comes in errorOnTimeout logical = false % if false, display warning only end % launch command as java process (does not wait for output) process = java.lang.Runtime.getRuntime().exec(command); % start the timeout timer! timeoutTimer = tic(); % Output reader (from https://www.mathworks.com/matlabcentral/answers/257278) outputReader = java.io.BufferedReader(java.io.InputStreamReader(process.getInputStream())); errorReader = java.io.BufferedReader(java.io.InputStreamReader(process.getErrorStream())); % initialize output char array cmdout = »; while true % If any lines are ready to read, append them to output % and display them if streamOutput is true if outputReader.ready() || errorReader.ready() if outputReader.ready() nextLine = char(outputReader.readLine()); elseif errorReader.ready() nextLine = char(errorReader.readLine()); end cmdout = [cmdout,nextLine,newline()]; if streamOutput == true disp(nextLine); end continue else % if there are no lines ready in the reader, and the % process is no longer running, then we are done if ~process.isAlive() break end % Check for timeout. If timeout is reached, destroy % the process and break if toc(timeoutTimer) > timeoutSeconds timeoutMessage = [‘sys_with_timeout(»’,command, »’,’, num2str(timeoutSeconds), ‘)’. ‘ failed after timeout of ‘,num2str(toc(timeoutTimer)),’ seconds’]; if errorOnTimeout == true error(timeoutMessage) else warning(timeoutMessage) end process.destroyForcibly(); break end end end if ~isempty(cmdout) cmdout(end) = []; % remove trailing newline of command output end status = process.exitValue(); % return end
>> [status,cmdout] = sys_with_timeout(‘wsl echo start! sleep 2 echo finished!’,1) start! Warning: sys_with_timeout(‘wsl echo start! sleep 2 echo finished!’,1) failed after timeout of 1.0002 seconds > In sys_with_timeout (line 41) status = 1 cmdout = ‘start!’
и вот пример функции, которая не истекает по тайм-ауту:
MATLAB 03 Написание программ
>> [status,cmdout] = sys_with_timeout(‘wsl echo start! sleep 2 echo finished!’,3) start! finished! status = 0 cmdout = ‘start! finished!’
Источник: reddeveloper.ru
Как остановить программу в матлаб
pause , by itself, causes M-files to stop and wait for you to press any key before continuing.
pause(n) pauses execution fo r n seconds before continuing, where n can be any real number. The resolution of the clock is platform specific. A fractional pause of 0.01 seconds should be supported on most platforms.
pause on allows subsequent pause commands to pause execution.
pause off ensures that any subsequent pause or pause(n) statements do not pause execution. This allows normally interactive scripts to run unattended.
How to abort a running program in MATLAB?
Sometimes after calling a function (which takes some 30 odd minutes to finish), you realize that you did something wrong and want to stop the program.
How do you do that in MATLAB?
What I do is shutdown MATLAB completely and restart. I think there would be a way to abort the execution of the function instead.
Anybody know what that is?
1 Answer 1
Hitting Ctrl + C usually does the trick, although sometimes it has been known to run into snags.
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Как прервать запущенную программу в MATLAB?
Иногда после вызова функции (для завершения которой требуется около 30 с лишним минут) вы понимаете, что сделали что-то не так и хотите остановить программу.
Как это сделать в MATLAB?
Что я делаю полностью выключите MATLAB и перезапустите. Думаю, есть способ отменить казнь функции вместо этого.
Кто-нибудь знает, что это такое?
задан 30 сен ’09, 16:09
Если вы столкнетесь с ситуацией, когда CTRL + C не помогает, эта ветка может быть актуальной: stackoverflow.com/questions/4791144/… — Dennis Jaheruddin
1 ответы
ответ дан 02 окт ’09, 05:10
Я часто обнаруживал, что добавление вызова drawow () в цикл помогает Matlab перехватить Ctrl + C. — МТРВ
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками matlab process abort or задайте свой вопрос.
kaktusenok
При долгих вычислениях иногда необходимо прекратить выполнение программы. Сделать это можно нажатием клавиш Ctrl+C в главном окне MATLAB.
Например, имеется функция, которая очевидно никогда не завершит своё выполнение:
Запустив её, единственным способом прервать вычисления, как указывалось выше, является комбинация клавиш Ctrl+C, нажав которую MATLAB прекратить вычисления и покажет сообщение об ошибке:
В данном случае прерывание выполнения не приведёт ни к чему плохому. Однако в некоторых случаях требуется выполнять дополнительные действия (освобождать память, закрывать файлы, показывать на графике текущие результаты и т.д.).
К сожалению (а может к счастью) исключительная ситуация не возбуждается. Поэтому в следующем примере по нажатию на Ctrl+C не будет выведено сообщение:
Единственным и правильным решением будет использование функции onCleanup:
Здесь используется механизм анонимных функций. Пара полезных примеров есть в документации по функции (на самом деле классу) onCleanup. В конце работы функции slow_function будет вызвана анонимная функция, которая выполняет необходимые действия.
Идея в основе класса (именно класса!) onCleanup проста — создать объект, проинициализировать его дескриптором на анонимную функцию, а в деструкторе вызвать эту анонимную функцию.
Может возникнуть ложное впечатление, что код:
сперва выведет «Опа», а затем «Сообщение!», поскольку cleanupObj выйдет из области видимости условного оператора.
Однако в MATLAB область видимости определяется по другому, чем в C и подобных ему языках: удаление переменных происходит по завершению функции или по выполнению функции clear. А вот код:
действительно выведет сперва «Опа», а затем «Сообщение!».
Просто ещё раз впечатляет архитектура и мощь объектно-ориентированного программирования в MATLAB.
Похожие публикации:
- Nt authority интерактивные s 1 5 4 что это
- Как нумеровать рисунки в ворде
- Как убрать n python при чтении из файла
- Какие просадки допустимы на линии 12v
Источник: gshimki.ru
Как я могу прервать выполнение программы в MATLAB?
Как я могу остановить выполнение программы в MATLAB, не выходя из MATLAB. Я ищу что-то вроде выхода (1) на С++.
Я пробовал выйти/выйти, но они также убивают MATLAB, а это не то поведение, которое мне нужно.
В идеале я бы использовал try-catch, чтобы всплывать ошибки, но я исправляю существующий код и не могу этого сделать из-за глубоко вложенного стека вызовов. Спасибо!
Я также пробовал error и return , но они попадают в блок catch вызывающих функций, что мне тоже не нужно. Я просто хочу остановить запущенную программу для выхода.
Кроме того, Ctrl-C требует, чтобы пользователь остановил выполнение, и это тоже не то, чего я хочу.
Nick 21 Фев 2014 в 08:12
Это действительно хороший вопрос, но я не думаю, что есть решение, если вы не хотите использовать исключения.
21 Фев 2014 в 08:24
Ха-ха, я искал что-то вроде «Это очень простой вопрос». Это странно. Возможно, мне придется полагаться на выход, но пользователь не будет знать, что его поразило, пока я не выведу в файл журнала, но это пока не вариант. Спасибо!
21 Фев 2014 в 08:26
Я не совсем понимаю вопрос. Что вы подразумеваете под >. Можете привести пример, скажем, с использованием воображаемой команды?
Autonomous
21 Фев 2014 в 08:28
Когда я запускаю приложение, которое сталкивается с фатальной ошибкой, которую нельзя корректно обработать. Я хочу остановить выполнение этой программы, чтобы не повредить вычисленные данные и позволить пользователю внести необходимые исправления и перезапустить выполнение, чтобы мы можем продолжить с того места, на котором остановились (по сути, убить/остановить/остановить/завершить/выйти из него).
21 Фев 2014 в 08:32
Если вы знаете строку, в которой могут возникнуть ошибки, то, я думаю, вы можете сделать следующее: 1. Сохраните все рабочее пространство. (на данный момент я точно не знаю, как это сделать) 3. Запустите эту функцию, когда вы загружаете данные из сохраненного файла .mat. Проблема становится сложнее (возможно, невозможной), когда вы не знаете, когда ожидать Ошибка. В любом случае, я думаю, что это было бы сложно на любом языке программирования, не говоря уже о MATLAB (верно?). Поскольку мне кажется, что вы хотите обнаружить ошибку до ее возникновения, что невозможно.
Autonomous
21 Фев 2014 в 08:46
3 ответа
Чтобы надежно использовать terminateExecution , я считаю необходимым вызвать короткий pause сразу после этого, чтобы дать Java время отправить нажатие клавиши и чтобы MATLAB обработал его. Все вложенные операторы try — catch будут нарушены, как я думаю, вам нужно.
killTest.m
function killTest try annoyingFunction(); fprintf(‘Does not run.’); catch ME fprintf(‘Fooled again! (%s)n’,ME.message); end end function annoyingFunction() somethingWrong = true; % more useful code here if somethingWrong, % error(‘annoyingFunction:catchableError’,’catchable error’); terminateExecution % by Pursuit % interrupt % by Matt B. pause(0.1) end end
Пример
Вы возвращаетесь в командную строку непосредственно из подфункции, но похоже, что программа была прервана нажатием клавиши:
>> killTest Operation terminated by user during killTest>annoyingFunction (line 17) In killTest (line 4) annoyingFunction(); >>
Если вместо этого вы используете error (раскомментируйте строку ошибки внутри annoyingFunction для проверки), она будет перехвачена оператором catch в killTest :
>> killTest Fooled again! (catchable error)
Предлагаемые изменения в interrupt (упрощение, более надежное получение дескриптора командного окна и удобочитаемость):
function interrupt import java.awt.event.KeyEvent import java.lang.reflection.* base = com.mathworks.mde.cmdwin.CmdWin.getInstance(); hCmd = base.getComponent(0).getViewport().getView(); cmdwin = handle(hCmd,’CallbackProperties’); argSig = javaArray(‘java.lang.Class’,1); argSig(1) = java.lang.Class.forName(‘java.awt.event.KeyEvent’); msTime = (8.64e7 * (now — datenum(‘1970’, ‘yyyy’))); args = javaArray(‘java.lang.Object’,1); args(1) = KeyEvent(cmdwin,KeyEvent.KEY_PRESSED,msTime. KeyEvent.CTRL_DOWN_MASK,KeyEvent.VK_C,KeyEvent.CHAR_UNDEFINED); method = cmdwin.getClass().getDeclaredMethod(‘processKeyEvent’,argSig); method.setAccessible(true); method.invoke(cmdwin,args);
Примечание. Если вы согласны с вводом чего-либо для полного выхода, просто используйте keyboard , а когда он остановится в приглашении отладки ( K>> ), введите dbquit , и вы вернетесь в базовое рабочее пространство. командная строка. Симпатичный способ предоставить интерактивный триггер для выполнения dbquit был предоставлен на странице программа чтения новостей MATLAB Central. Моя версия этого решения:
fprintf(‘Terminate execution?nYes / Non’); keyboard
Когда этот фрагмент кода запускается, вы получаете небольшую подсказку, подобную этой:
Terminate execution? Yes / No
Текст «Да» и «Нет» будет кликабельным и будет выполнен либо dbquit , либо dbcont .
Источник: question-it.com