Мне нужно много копировать разные файлы в разные папки. Я могу добавить все свои команды копирования в скрипт bash и затем запустить его, но затем я должен дождаться его завершения, если я хочу добавить больше команд в эту «очередь» копирования.
Есть ли способ, которым я могу запускать команды в виде очереди и как бы добавлять команды в эту очередь во время работы?
Объясненный по-другому, я хочу начать долгосрочную задачу. Пока он работает, я хочу запустить еще один, который на самом деле не запускается, пока не будет сделан первый. А затем добавить еще один после этого последнего и так далее. Возможно ли это как-то?
Ответы:
at
Утилита, самая известная для запуска команд в заданное время, также имеет функцию очереди и может быть предложена для запуска команды в настоящее время. Он читает команду для запуска со стандартного ввода.Команда
batch
эквивалентнаat -q b -m now
(-m
означает, что выходные данные команды, если таковые имеются, будут отправлены вам по почте, как это делает cron). Не все варианты Unix поддерживают имена очередей (-q myqueue
); Вы можете быть ограничены одной вызванной очередьюb
. Linuxat
ограничен однобуквенными именами очередей.источник
now
нет-t now
, извините. Я не заметил, что это неправильно в примере кода.Добавьте
&
в конец вашей команды, чтобы отправить ее в фоновом режиме, а затемwait
на него, прежде чем запускать следующую. Например:источник
wait
? Это кажется непроницаемым для всех моих убийств.wait
Просто прекращает работу до тех пор , пока предыдущие закончить.nohup
?Решения Брэда и Манкова являются хорошими предложениями. Другой вариант, похожий на их комбинацию, заключается в использовании GNU Screen для реализации вашей очереди. Преимущество этого в том, что вы можете работать в фоновом режиме, вы можете проверять это всякий раз, когда вы помещаете в очередь новые команды, просто вставляя их в буфер, который будет выполнен после выхода из предыдущих команд.
Первый забег:
(кстати, сейчас хорошее время, чтобы поиграть с некоторыми классными . screenrc файлами )
Это вызовет сеанс фонового экрана для вас с именем queue.
Теперь поставьте в очередь столько команд, сколько хотите:
Я делаю несколько команд в приведенном выше только для тестирования. Ваш вариант использования будет выглядеть примерно так:
Обратите внимание, что «^ M» в моей строке выше - это способ получить встроенную новую строку, которая будет интерпретирована позже после того, как экран вставит ее в существующую оболочку bash. Используйте «CTL-V», чтобы получить эту последовательность.
Было бы довольно легко сделать несколько простых сценариев оболочки для автоматизации этого и поставить команды в очередь. Затем всякий раз, когда вы хотите проверить состояние фоновой очереди, вы повторно присоединяете через:
Технически, вам даже не нужно называть ваш сеанс экрана, и он будет работать нормально, но как только вы его зацепите, вы все равно захотите оставить его включенным. ;-)
Конечно, если вы сделаете это, другой хороший способ сделать это - назвать одну из текущих окон «очередь» и использовать:
источник
Есть утилита, которую я использовал с большим успехом именно для описанного вами варианта использования. Недавно я перенес свой основной ноутбук на новое оборудование, которое включало перенос некоторых файлов на NAS, а остальные - на новую машину.
Вот как я это сделал.
Настройте все машины, подключенные к сетевому соединению, чтобы они могли связаться друг с другом.
На компьютере, с которого вы перемещаете файлы (в дальнейшем называемом исходным компьютером), установите rsync
apt-get install rsync
и Task Spooler с секретным соусом (веб-сайт http://vicerveza.homeunix.net/~viric/soft/ts/ ). Если вы используете Debian, имя пакета дляts
istask-spooler
и исполняемый файл переименовываются,tsp
чтобы избежать конфликта имен сts
исполняемым файлом изmoreutils
пакета. Пакет Debian, связанный с веб-сайтом, отлично устанавливается на Ubuntudpkg -i task-spooler_0.7.3-1_amd64.deb
или аналогичном.Также убедитесь, что на всех машинах установлен SSH
apt-get install openssh-server
. На исходном компьютере вам нужно настроить SSH, чтобы разрешить вход без пароля на целевые компьютеры. Чаще всего будет использоваться метод аутентификации с открытым ключомssh-agent
( примеры приведены в https://www.google.se/search?q=ssh+public+key+authentication ), но иногда я использую более простой метод, который работает просто а также с аутентификацией по паролю. Добавьте следующее в вашу конфигурацию клиента SSH (~/.ssh/config
или/etc/ssh/ssh_config
):Затем откройте один терминал на исходном компьютере, войдите в систему
ssh target1
, выполните обычную аутентификацию и оставьте этот терминал открытым. Обратите внимание, что существует файл сокета с именем~/.ssh/master-user@target1:22
, это файл, который будет держать аутентифицированную основную сессию открытой и разрешать последующие соединения без пароляuser
(при условии, что соединение использует одно и то же целевое имя хоста и порт).На этом этапе вам необходимо убедиться, что вы можете войти в систему без запроса аутентификации на целевых машинах.
Теперь запустите
ts rsync -ave ssh bigfile user@target1:
для одного файла илиts rsync -ave ssh bigdir user@target1:
для каталога. При использовании rsync важно не включать косую черту в каталог (bigdir
по сравнению сbigdir/
), иначе rsync будет считать, что вы имели в виду эквивалентbigdir/*
большинства других инструментов.Диспетчер задач вернет приглашение и позволит вам поставить в очередь многие из этих команд подряд. Проверьте очередь выполнения
ts
без аргументов.Диспетчер задач имеет много функций, таких как реорганизация очереди выполнения, запуск определенного задания только в случае успешного выполнения другого задания и т. Д. См. Справку
ts -h
. Иногда я проверяю вывод команды, пока он работает сts -c
.Есть и другие способы сделать это, но для вашего случая использования они все включают диспетчер задач. Я решил использовать rsync поверх SSH для сохранения временных меток файлов, которых не было бы при копировании через SMB.
источник
ts
, он кажется очень мощным и простым в использовании, просто разветвленный на github, с автоинструкцией и дебианизацией.task-spooler
:-) ... в любом случае, это в вашем комментарии очень хорошее предложение, я сделаю это очень скоро.Мне тоже часто нужны такие вещи. Я написал небольшую утилиту под названием,
after
которая выполняет команду всякий раз, когда завершается какой-то другой процесс. Это выглядит так:Затем вы запускаете это так:
Большим преимуществом этого по сравнению с некоторыми другими подходами является то, что первое задание не нужно выполнять каким-либо особым образом, вы можете следить за любым процессом с новым заданием.
источник
Command1 && Command2
источник
Вы можете просто добавить команды в командную строку оболочки, в которой уже выполняется команда.
Либо наберите внимательно, либо напечатайте в другом месте, проверьте и вырежьте и вставьте. Даже если текущая команда издает строки вывода, вы все равно можете набрать что-то новое, нажать ввод, и она запустится, когда все команды будут запущены или введены до ее завершения.
Пример следует. Вы можете вырезать и вставить все это или ввести последующие команды во время выполнения 1-го (если вы действительно очень быстро печатаете) или, скорее всего, во время выполнения 2-го:
источник
самый хакерский способ, который я могу придумать, - это поддерживать состояние очереди с помощью простых файлов блокировки в / tmp. когда file1.sh выполняет свои команды cp, он сохраняет файл блокировки (или жесткую ссылку) в / tmp. когда это будет сделано, удалите файл. любой другой скрипт должен искать в / tmp файлы блокировки с выбранной вами схемой именования. Естественно, это подвержено всевозможным сбоям, но настроить его тривиально и полностью выполнимо в bash.
источник