Как написать скрипт для чтения пользовательского ввода, а затем запустить в фоновом режиме, даже закрывая терминал в TCSH?

274
Scout

Я ищу предложение стратегии. Я очень плохо знаком с сценариями оболочки Linux. Просто учу tcsh не более месяца. Мне нужен скрипт, который автоматически определяет, когда файлы результатов копируются с удаленного сервера в папку на удаленном компьютере, а затем запускают scp файлы обратно на мою рабочую станцию. Я не знаю заранее, когда работа закончится, поэтому в папке не может быть никаких файлов результатов в течение длительного времени. Я также не знаю, когда последний файл результатов будет скопирован обратно с удаленного сервера в папку (и, следовательно, может запустить scp).

Я попробовал crontab. Работать нормально, когда я правильно угадываю, большую часть времени просто разочаровывает. Поэтому я попытался написать сценарий сам, и теперь он у меня есть. Я намерен создать сценарий, который будет служить мне и моим коллегам тоже. Чтобы использовать скрипт, пользователю сначала необходимо войти на удаленный компьютер вручную. Затем выполняйте сценарий только на удаленной машине. Сначала сценарий просит пользователя ввести имя своего локального компьютера и каталог, в котором он хочет сохранить файлы результатов. Затем скрипт будет просто зацикливаться, чтобы проверить, когда изменяется общее количество файлов. Когда он обнаружил это, что означает, что первый файл результатов начинает копироваться обратно с удаленного сервера, он снова зацикливается, чтобы определить, когда общий размер файлов в папке перестает изменяться, что означает, что последний файл результатов закончен, скопирован в папка.

Скрипт работает нормально, но я хочу, чтобы скрипт работал в фоновом режиме и работал самостоятельно, даже если пользователь вышел из системы с удаленного компьютера и закрыл терминал. А также я хочу позволить пользователю просто набрать в терминале простую команду для запуска скрипта, что-то вроде простого

./script.tcsh

Я пытался запустить скрипт по команде

./script.tcsh &

но не удается, потому что фоновый процесс не может принять пользовательский ввод.

Гугл и нашел что-то под названием disown, но команда не найдена. Очевидно, удаленный компьютер и мой компьютер не поддерживают эту команду.

Попытка изменить сценарий, чтобы сначала принять ввод пользователя, а затем попытаться использовать

cat > temp_script.tcsh << EOF  EOF 

а затем линия

./temp_script.tcsh & 

попытаться создать другой файл сценария и использовать первый сценарий для запуска второго сценария в фоновом режиме. Также сбой, потому что cat не обрабатывает переменную $ как текст, он заменяет ее значениями. У меня есть цикл foreach i (1 2), а команда cat просто сообщает об ошибке (отсутствует значение переменной i, которая является просто счетчиком в синтаксисе цикла foreach).

Я не в себе в данный момент. Может ли кто-нибудь просветить меня какой-нибудь стратегией, которую я могу попробовать сам? Цель состоит в том, чтобы использовать только 1 файл сценария и запрашивать у пользователя 2 ввода (имя компьютера и каталог для сохранения), после чего больше не нужно взаимодействовать с пользователем или ожидать, и он может работать даже при закрытии терминала.

Примечание: мне не нужен пароль для входа на удаленный компьютер и обратно.

0
Можно ли использовать rsync? Если это так, у вас может быть задание crontab, которое запускается каждые n минут. Он скопирует неполные файлы, но в конечном итоге конечный результат будет чистым. Вот скрипт, который обеспечивает работу только одного rsync: https://superuser.com/questions/847850/behavior-of-rsync-with-file-thats-still-being-written?s=1|54.5125 Louis 6 лет назад 1
Спасибо за ответ. Я могу использовать rsync на удаленной машине. Однако из-за ограничения скорости интернет-соединения, я склонен сначала сжать все требуемые файлы (используя команду tar) перед запуском scp. Из опыта это имеет значение, потому что многие файлы являются большими файлами ASCII, поэтому они очень сжимаемы. Scout 6 лет назад 0
Другая проблема заключается в том, что некоторые из моих коллег не очень хорошо владеют Linux. Поэтому я стараюсь приложить как можно меньше усилий. Я думаю, что могу сделать сценарий для создания crontab, который использует rsync, но если я правильно понимаю идею, пользователю все равно нужно будет удалить crontab вручную после его завершения, иначе он просто продолжит работу на удаленной машине (хотя и копирует). ничего такого). Этот шаг необходимости пользователя вручную удалить crontab делает меня менее склонным к этой методологии. Я хочу, чтобы пользователь выполнил скрипт, а потом перестал беспокоиться об этом навсегда. Scout 6 лет назад 0
Сказав это, я очень люблю Rsync. Я хотел бы открыть эту команду раньше. Scout 6 лет назад 0
Да, crontab нужно будет остановить вручную. Может быть, вы могли бы сделать сценарий разумным и не делать ничего после некоторого момента. Но для crontab я полагаю, что это так же просто, как ввод пользователя `crontab -e`, а затем добавление` # `(знака фунта) перед заданием rsync, чтобы прокомментировать его, или удаление` # `для повторной вставки в scheulde. Включить сжатие в rsync можно с помощью флага `z`. Это, вероятно, медленнее, но использует меньшую пропускную способность. Кроме того, в linux хорошо / страшно то, что если вы можете sudo, то вы можете войти в crontab вашего коллеги. Таким образом, вы всегда можете исправить вещи для них, если они потерялись. Louis 6 лет назад 0
Мне нужно проверить, могу ли я использовать команду `sudo`. Впервые слышу об этом. С другой стороны, я только что обнаружил, что `cat` можно заставить печатать буквально без замены переменной, все что мне нужно, это добавить двойные кавычки. я имею в виду `cat> temp_script.tcsh <<" EOF "` Если это работает так, как я себе представляю, я могу решить свою проблему. Я думаю, что моей возможной проблемой может быть то, как позволить второму сценарию использовать значение входной переменной пользователя, которое хранится в первом сценарии. Мне придется попробовать это снова в офисе. Scout 6 лет назад 0
Я предлагаю вам не запрашивать у пользователя ввод данных через cron. Я думаю, что я нашел бы это действительно раздражающим и возможно опасным, если бы я сделал вклад, который сделал что-то неожиданное. Я предлагаю сделать что-то другое или спросить их только один раз. Louis 6 лет назад 0
`Cat> temp_script.tcsh <<" EOF "` работает так, как я себе представлял, и, наконец, мой скрипт работал так, как задумано. Спасибо Луи за ваш отзыв. Вы единственный, кто хочет меня развлечь. Scout 6 лет назад 0

0 ответов на вопрос

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