Вы могли рассмотреть для использования соединения SSH, совместно использующего:
Host *.some-domain
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
Вы соединяетесь только однажды со своим местом назначения и помещаете процесс ssh в фон. Затем Вы выполняете другие команды, и Вы наконец уничтожаете первый процесс.
В альтернативе можно попытаться инкапсулировать набор действий в рамках одного единственного соединения SSH.
Например, предположите, что у Вас есть каталог:
mycommands
|
+- run
+- new_data
Затем можно упаковать эти данные в tar и отправить их в сценарий:
tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run'
Теперь Вы run
сценарий может получить доступ ко всем Вашим входным данным (здесь, мы имеем только new_data
как в Вашем примере). Чтобы придерживаться Вашего примера, вот run
сценарий:
#!/bin/sh
BASE=`dirname $0`
/etc/init.d/some_service stop
cat /var/some_service/events
mv $BASE/new_data /var/some_service/new_data
/etc/init.d/some_service start
rm -rf $BASE
Так, теперь просто необходимо сохранить events
файл:
tar cf - -C mycommands . | ssh localhost 'D=`mktemp -d`; tar xf - -C $D; $D/run' >./events
и в более общем плане у Вас может быть Ваш run
сценарий производит tar и затем передает по каналу ssh
в tar для распаковки его локально.
Самый легкий путь состоит в том, чтобы преобразовать дату в Unix time_t значение (т.е. секунды с начала эпохи, или '01.01.1970 0:00:00'), и затем substract 30 дней * 86 400 секунд в день от того числа.
например, следующее использование в качестве примера set -x
так, чтобы Вы видели значение переменной D, когда это изменяется.
#! /bin/ksh
set -x
D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))
date -d "@$D"
Обратите внимание, что это зависит от версии GNU date
, от GNU Coreutils. Другие версии даты не могут поддерживать преобразование значения time_t назад к отформатированной дате с @
. Если Вы не установили GNU coreutils, это, вероятно, не доступно в Вашей системе AIX так gawk
вероятно, Ваш наилучший вариант преобразовать назад в отформатированную дату:
echo "$D" | gawk '{print strftime("%c", $0)}'
мой исходный ответ здесь предложил плоскость awk, но дальнейшее тестирование в моей debian системе показало это ни один mawk
ни original-awk
имейте strftime
встроенная функция, таким образом, необходимо будет установить или GNU Coreutils или GNU Awk.
Если жемчуг установлен в системе, жемчуг может использоваться вместо awk:
echo $D | perl -nE 'say scalar gmtime $_'
Существует несколько альтернативных методов и примеров выполнения этого в:
https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Попробуйте это:
date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01
1 ноября 2012 используется для иллюстрации. Это может иметь любую дату ввода данных пользователем.
Ваш пример использует относительные объекты в строках даты, которые являются расширением даты GNU.
Например, на Fedora 19 Ваш пример работает как ожидалось:
$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13
Таким образом можно удостовериться, что сценарий использует дату GNU.
Попробуйте это.
DAY30=`TZ=EST+720 date "+%Y-%m-%d"`
print $DAY30
720 - это смещение в часах. Итак, 30 дней - это 720 часов.
EST - мой часовой пояс. Я предполагаю, что вы можете использовать любой подходящий часовой пояс.