Почему я не могу свободно использовать bash после использования утилиты "At"? (Не могу вставить стандартный ввод, пока Ctrl+ C)
Я запустил следующий блок кода (at тайм-аут для удаления PHPmyadmin). Это должно быть запланировано на 2 часа вперед, но я запустил его за 2 минуты, просто чтобы проверить:
bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'
apt-get purge phpmyadmin -y
PMA_UNINSTALL
at Утилита, кажется, мешает мне свободно использовать Bash, если я не использую CTRL+C.At также выдает следующее предупреждение, которое является нормальным и жестко запрограммировано в исходном коде утилиты. Когда я нажимаю CTRL+C, предупреждение исчезает, и я снова могу регулярно пользоваться Bash.
команды будут выполняться с использованием /bin/sh
Я не говорю, что это предупреждение, которое мешает мне регулярно использовать Bash, пока он появляется. Я знаю, что предупреждение - это просто стандартный вывод, и что-то еще может помешать мне создать стандартный ввод.
Что мешает мне создать stdin, передающий вышеуказанный блок кода at и как я мог достичь состояния, когда я мог выполнять команды, передаваемые по адресу at, но сразу после этого свободно использовать Bash, не прерывая at работать?
2 ответа
Мне потребовалось некоторое время, чтобы увидеть вашу настоящую проблему - вы хотите напрямую отправить команду at вместо того, чтобы предоставить команду (ы) впоследствии, как я предполагал.
Нет необходимости в сложной схеме, просто введите
echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'
Когда вы делаете это таким образом at впоследствии не ожидает ввода, и вы немедленно возвращаетесь в командную строку.
(сохраняя мой оригинальный ответ здесь)
Выдача at дает вам возможность перечислить команды для выполнения. Ты должен сказать at что вы сделали:
Нажмите CTRL + D (это также известно как конец передачи)
TL;DR: эти команды, кажется, не выполняют то, что вы, вероятно, намереваетесь.
Если вы пытаетесь сделать at выполнять apt-get purge phpmyadmin -y от bash через 2 минуты ваш код не будет делать то, что вы хотите.
Команда слева от трубы (|) имеет ваш документ здесь в качестве стандартного ввода. Эта команда даже не запускается, пока оболочка не прочитает ваш полный документ здесь.
С 3.6.6 Вот документы в справочном руководстве Bash:
Этот тип перенаправления инструктирует оболочку читать входные данные из текущего источника, пока не будет видна строка, содержащая только слово (без конечных пробелов). Все строки, считанные до этой точки, затем используются в качестве стандартного ввода (или дескриптора файла n, если указано n) для команды.
По сути, команда с документом здесь - это всего лишь одна команда, которая должна быть полностью прочитана оболочкой, прежде чем она будет выполнена. В вашем коде оболочка читает ввод до PMA_UNINSTALL появляется на линии отдельно. Как только это произошло, оболочка затем использует содержимое документа здесь в качестве файлового дескриптора 50 для команды bash /dev/fd/50,
Эта команда даже не запускает новый экземпляр bash пока здесь документ не был полностью прочитан. когда bash работает, он запускает эту команду:
apt-get purge phpmyadmin -y
Так как вся левая сторона трубы, включая документ здесь, имеет стандартный вывод в atвход at получает это выход bash, который является выходом apt-get purge phpmyadmin -y, at затем пытается интерпретировать этот вывод - не ваш apt-get команда, но ее вывод- как список команд для выполнения в /bin/sh,
Так что это почти наверняка не то, что вы хотите сделать.
Я не уверен, почему вы не получаете подсказку обратно сразу после ввода этого кода. Когда я запускаю его на тестовом компьютере, я получаю приглашение оболочки через пару секунд. Если вы хотите отладить это, вы можете попробовать запустить apt-get purge phpmyadmin -y интерактивно в Bash. Как написан ваш код, эта команда выполняется полностью раньше at возвращается в оболочку (и до at можно запланировать что угодно). Хотя, вероятно, было бы бесполезно отлаживать этот конкретный код дальше.