Почему я не могу свободно использовать 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 можно запланировать что угодно). Хотя, вероятно, было бы бесполезно отлаживать этот конкретный код дальше.

Другие вопросы по тегам