Я выполнил следующий блок кода ( 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
также запрашивают соблюдающее предупреждение, которое нормально, и hardcoded в исходном коде Утилиты. Когда я делаю CTRL+C, предупреждение исчезает, и я могу использовать Bash регулярно снова.
команды будут выполняться с помощью/bin/sh
Я не говорю, что это - предупреждение, которое препятствует тому, чтобы я использовал Bash регулярно как долго, это появляется. Я знаю, что предупреждение просто stdout, и что-то еще могло бы препятствовать тому, чтобы я создал stdin.
Что препятствует тому, чтобы я создал stdin передача по каналу вышеупомянутого блока кода с at
и как я мог достигнуть состояния, когда я мог выполнить команды, переданные по каналу с в, но использовать Bash, свободно правильный впоследствии без прерывания at
работать?
Мне потребовалось некоторое время для наблюдения настоящей проблемы - Вы хотите непосредственно отправить команду в at
вместо того, чтобы обеспечить команду (команды) впоследствии, как я предположил.
нет никакой потребности в сложной схеме, просто тип
echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'
, Когда Вы делаете это, этот путь at
не ожидает входа впоследствии, и Вы сразу возвращаетесь к командной строке.
(хранение моего исходного ответа здесь)
Издание at
дает Вам возможность перечислить команды для выполнения. Необходимо сказать at
, что Вы сделаны:
Нажатие CTRL + D (Это также известно как Конец Transmisssion)
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
в интерактивном режиме в ударе. Путем Ваш код написан, та команда работает полностью прежде at
возвраты к оболочке (и прежде at
может запланировать что-либо). Вероятно, не было бы полезно отладить этот конкретный код далее, все же.