2015-02-04 3 views
0

Например, я пытаюсь использовать echo "haha" | at 20:30, чтобы выполнить мою команду за несколько минут.Почему моя команда «at» в терминале не работает?

Но команда никогда не выполняет:

$ date 
Tue 3 Feb 2015 20:47:22 AST 
$ echo "test" | at 20:48 
job 5 at Tue Feb 3 20:48:00 2015 
$ date 
Tue 3 Feb 2015 20:48:05 AST 

Что я делаю неправильно?

+0

Почему вы думаете, что делаете что-то неправильно?'atd' запускает команды как подпроцессы своего демона - на ваш терминал не будет выводиться, даже если команда' test' _did_ имеет какой-либо вывод (а это не так). –

+0

Имейте в виду также - 'echo" test "| в 20: 48' не отправляет «echo» test «' to 'at', он отправляет' test' на; труба оболочки соединяет ** выход ** команды слева с входом команды справа, а выход теста «echo» - 'test'. –

+0

@CharlesDuffy Итак, как мне отправить команду? –

ответ

2

Традиционное использование было бы больше похоже:

at 20:48 <<'EOF' 
echo "test" >/tmp/hello_world 
EOF 

Проверить /tmp/hello_world после времени, отведенного прошло.


В этом случае, что вы посылаете в поток ввода команды at является весь документ - все между <<'EOF' и следующим EOF.

4

Ваша команда:

echo "test" | at 20:48 

говорит at выполнить команду test без аргументов. Это встроенная оболочка, которая работает, но не работает. Попробуйте:

test 
echo $? 

Это дает 1 для меня, указывая на провал.

Вы, наверное, имели в виду что-то вроде:

echo "echo test" | at 20:48 

Теперь вы просто должны знать, где выход будет. /dev/null - разумное предположение. Итак, попробуйте:

echo "echo test > /tmp/x39.214" | at 20:48 

Затем, когда 20:48 (или выбранный новое время) пришел и ушел, искать файл /tmp/x39.214 содержать строку test.

Команда at считывает свой стандартный ввод для выполнения ряда команд. Они запускаются с вашей средой, но без подключения терминала (поэтому /dev/null - это стандартный ввод, вывод, ошибка — или, если нет, вы будете получать выходные данные по электронной почте). Поэтому ваша команда должна организовать хранение своих выходов, где вы можете их найти. Фиксированное имя, например /tmp/x39.214, не является хорошей идеей, но вам нужно определить, куда будет идти файл и какое имя будет. Часто имя будет включать время.

Поскольку at читает стандартный ввод, вы можете перенаправить стандартный ввод любым удобным вам способом, с помощью здесь doc, или здесь строки, или из файла, или с помощью канала, чтобы назвать только четыре механизма.

$ echo "echo test >/tmp/x39.214" > file1.txt 
$ at 20:48 < file1.txt 
$ at 20:48 <<'EOF' 
> echo test >/tmp/x39.214 
> EOF 
$ at 20:48 <<< 'echo test >/tmp/x39.214' 
$ cat file1.txt | at 20:48 
$ 

я опустил выход из at для каждого из перечисленных выше команд.

at -l Чтобы просмотреть список вакансий и просмотреть, что будет работать.

+0

'echo" test "' в терминале работает, хотя, почему я думаю, что я пытаюсь выполнить команду "test"? –

+0

'echo" test "' эхо просто 'test', не так ли? Так вот что 'at' видит в качестве стандартного ввода. Он вообще не видит «эха». –

+0

Я был под впечатлением, что 'at' часть просто планирует предыдущую команду в определенное время. Что именно он делает? Если я пишу эхо-тест «echo», «в терминале он говорит« echo test ». Так зачем делать то, что я хочу в файл? –