Я запустил следующий блок кода ( 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, пока оно появляется. Я знаю, что предупреждение — это просто stdout, и что-то еще может помешать мне создать stdin.
Что мешает мне создать stdin, передающий вышеуказанный блок кода с помощью конвейера, at
и как мне достичь состояния, когда я смогу выполнять команды, переданные с помощью конвейера at, но свободно использовать Bash сразу после этого, не прерывая at
работу?
решение1
Мне потребовалось некоторое время, чтобы увидеть вашу реальную проблему — вы хотите напрямую отправить команду at
вместо того, чтобы предоставить команду(ы) впоследствии, как я предполагал.
Нет необходимости в сложной схеме, просто введите
echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'
При таком подходе at
не требуется никаких дополнительных действий, и вы сразу же возвращаетесь в командную строку.
(сохраню свой первоначальный ответ здесь)
Выдача at
дает вам возможность перечислить команды для выполнения. Вы должны сказать, at
что вы закончили:
Нажмите CTRL+ D(Это также известно какКонец передачи)
решение2
TL;DR: Похоже, эти команды не делают то, что вы, вероятно, намеревались сделать.
Если вы пытаетесь выполнить at
код apt-get purge phpmyadmin -y
за bash
2 минуты, то ваш код не будет делать то, что вам нужно.
Команда слева от трубы ( |
) использует ваш документ here в качестве стандартного ввода. Эта команда даже не запустится, пока оболочка не прочитает ваш документ here полностью.
От3.6.6 Здесь документывСправочное руководство по Bash:
Этот тип перенаправления предписывает оболочке считывать входные данные из текущего источника до тех пор, пока не будет найдена строка, содержащая толькослово(без конечных пробелов). Все строки, прочитанные до этого момента, затем используются как стандартный ввод (или файловый дескрипторнеслинуказано) для команды.
Команда с документом here, по сути, является просто одной командой, которая должна быть полностью прочитана оболочкой перед ее выполнением. В вашем коде оболочка считывает вводдо PMA_UNINSTALL
появляется на строке сам по себе. Как только это произошло, оболочказатемиспользует содержимое документа here в качестве дескриптора файла 50 для команды bash /dev/fd/50
.
Эта команда даже не запускает новый экземпляр bash
до тех пор, пока документ here не будет полностью прочитан. Когда 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
можно что-либо запланировать). Хотя, вероятно, не будет полезно отлаживать этот конкретный код дальше.