Недавно мне нужно было создать отличный сценарий, который удаляет некоторые каталоги на машине с Linux. Вот почему:
- У нас есть сервер для выполнения запланированных работ. Такие задания, как ETL из одной БД в другую, Файл в БД и т. Д. Сервер активирует клиентов, которые находятся на машинах, на которые мы хотим воздействовать. Большая часть (почти все) рабочих мест написаны в отличных сценариях.
- Частью нашего процесса CI является развертывание WAR на выделенном сервере. Затем у нас есть скрипт, который, помимо прочего, использует программную ссылку для направления «веб-приложений» во вновь созданный каталог. Это развертывание происходит один раз в час, что быстро заполняет выделенный сервер.
Поэтому мне нужно было создать скрипт, который проверяет все каталоги в правильном месте и удаляет старые. Я решил сохранить последние 4 каталога. В настоящее время это магическое число в сценарии. Если я хочу / нужно, я могу сделать это в качестве входного параметра. Но я решил начать с простого.
Я решил сделать это очень просто:
- Перечислите все каталоги с префиксом webapp_ в известном месте
- Сортируйте их по времени по убыванию и запускайте удаление по всем начальным индексам 4.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
def numberOfDirectoriesToKeep = 4 def webappsDir = new File( '/usr/local/tomcat/tomcat_aps' ) def webDirectories = webappsDir.listFiles().grep(~/.*webapps_.*/) def numberOfWeappsDirectories = webDirectories.size(); if (numberOfWeappsDirectories >= numberOfDirectoriesToKeep) { webDirectories.sort{it.lastModified() }.reverse()[numberOfDirectoriesToKeep..numberOfWeappsDirectories- 1 ].each { logger.info( "Deleteing ${it}" ); // here we'll delete the file. First try was doing a Java/groovy command of deleting directories } } else { logger.info( "Too few web directories" ) } |
Это не сработало. Файлы не были удалены. Случилось так, что агент работает от имени другого пользователя, чем тот, который запускает tomcat. У агента не было разрешений на удаление каталогов.
Моим решением было запустить команду оболочки с помощью sudo
.
Я нашел ссылки на:
и:
Короче говоря, вот полный сценарий:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import org.slf4j.Logger import com.my.ProcessingJobResult def Logger logger = jobLogger //ProcessingJobResult is proprietary def ProcessingJobResult result = jobResult try { logger.info( "Deleting old webapps from CI - START" ) def numberOfDirectoriesToKeep = 4 // Can be externalized to input parameter def webappsDir = new File( '/usr/local/tomcat/tomcat_aps' ) def webDirectories = webappsDir.listFiles().grep(~/.*webapps_.*/) def numberOfWeappsDirectories = webDirectories.size(); if (numberOfWeappsDirectories >= numberOfDirectoriesToKeep) { webDirectories.sort{it.lastModified() }.reverse()[numberOfDirectoriesToKeep..numberOfWeappsDirectories- 1 ].each { logger.info( "Deleteing ${it}" ); def deleteCommand = "sudo -u tomcat rm -rf " + it.toString(); deleteCommand.execute(); } } else { logger.info( "Too few web directories" ) } result.status = Boolean.TRUE result.resultDescription = "Deleting old webapps from CI ended" logger.info( "Deleting old webapps from CI - DONE" ) } catch (Exception e) { logger.error(e.message, e) result.status = Boolean.FALSE result.resultError = e.message } return result |
Кстати, есть небольшая ошибка индексов, которую я решил не исправлять (сейчас), так как у нас всегда больше каталогов.
Ссылка: | Использование Groovy для Bash (shell) Операции от нашего партнера по JCG Эяля Голана в блоге « Обучение и совершенствование в качестве мастера» . |