Используя grep
Вы могли просто использовать расширение оболочки на /proc
и передайте его по каналу к grep
:
$ echo /proc/* | grep -oP "(?<=/proc/)\D.*? " | paste -s -d ''
$ echo /proc/* | grep -oP "(?<=/proc/)\D.*? " | paste -s -d ''
acpi asound buddyinfo bus cgroups ....
Вышеупомянутое использует grep
способность использовать механизм регулярного выражения Perl (PCRE). Это -P
переключатель к grep
. -o
говорит grep
только возвратить строки, которые соответствуют шаблону. Мы затем используем способность Perl к lookbehinds. Таким образом, когда мы находим строку этим существа с /proc
, мы затем заботимся /proc
для любых строк, которые не запускаются с цифры (\D
). Это строки, которые являются возвратом (нецифра стартовые).
Вставка делает некоторую очистку для нас путем удаления всех символов новой строки что grep
добавленный, когда это запуск, отображающий его результаты.
Используя sed
Альтернатива этому методу должна была бы использовать sed
вместо этого (эй, который рифмует).
$ echo /proc/* | sed 's@/proc/[0-9]\+ @@g;s@/proc/@@g'
Этот подход находит все строки, запускающиеся с /proc/
И цифры и пространство и заменяют ими ни с чем, эффективно удаляя их. После этого мы делаем другого sed
команда, которая делает то же к /proc/
строки, и нас оставляют только с начальными строками нецифры.
Для "сопоставления" вывода в столбцы, paste
команда делает это довольно легко. Здесь я делаю 2 столбца, но можно измениться paste
команда для генерации более или менее путем добавления дополнительных тире (-
). column -t
в конце вынуждает вывод выстроиться в линию на столбцах.
$ ls /proc | grep -v "^[0-9].*" | paste - - | column -t
Сначала 5 строк вывода благодаря head -5
.
$ ls /proc | grep -v "^[0-9].*" | paste - - |column -t | head -5
acpi asound
buddyinfo bus
cgroups cmdline
cpuinfo crypto
devices diskstats
Вот то же самое с 4 столбцами:
$ ls /proc | grep -v "^[0-9].*" | paste - - - - |column -t | head -5
acpi asound buddyinfo bus
cgroups cmdline cpuinfo crypto
devices diskstats dma dri
driver execdomains fb filesystems
fs interrupts iomem ioports
Примечание: На ответ @JosephR., если Вы встречаетесь с какими-либо проблемами с вышеупомянутыми командами, которые анализируют вывод от ls
, можно снабдить префиксом его команду Bash, command
, который обойдет любые псевдонимы, можно иметь в распоряжении для ls
.
$ command ls /proc | grep -v "^[0-9].*" | paste - - - - |column -t | head -5
acpi asound buddyinfo bus
cgroups cmdline cpuinfo crypto
devices diskstats dma dri
driver execdomains fb filesystems
fs interrupts iomem ioports
Чтобы понять, как часто вам нужно выполнять задания, возьмите наибольший общий коэффициент ограничений cron и желаемый интервал.
Итак, для "каждые 30 часов 30 минут" это будет "каждые 30 минут", а для "каждые 30 часов" это будет "каждые 6 часов" (самый большой общий коэффициент 30 и 24)
Проще всего это сделать, используя [113068][0, cron_interval)[113069] в качестве окна, внутри которого задача должна попасть, чтобы быть выполнена.
Для учета джиттера в обоих направлениях, мы сдвигаем начальный край окна назад на 10% его длительности, так как запуск слишком рано будет редким, а запуск слишком поздно может произойти в любой момент, когда система настолько погружена в работу, что оберточный скрипт задерживается при вызове [113070] времени. time()[113071].
Если, как я подозреваю, [112862]get_top.py[112863] - ваше собственное творение, просто прикрепите это сверху и измените проверку на
Кроме того, столбцы не зависят друг от друга. Если вы поместите [112844]*/10[112845] в колонку часов и [112846]2,17[112847] в колонку минут, скрипт будет работать в 0:02, 0:17, 10:02, 10:17, 20:02 и 20:17.
Я не знаю простого способа запускать скрипт каждые 1830 минут. Вы могли бы использовать скрипт для изменения расписания через 1830 минут с помощью команды [112848]at[112849], но это не очень надежно.[112405].
Он будет выполняться каждый час, выполняя вычисления, чтобы определить, делится ли этот час на 30. Если это modulo разделение ([114600]% 30[114601]) вернет 0, что означает, что мы находимся в 30-часовой ситуации. Если это так, то ваша команда ([114602]your_command[114603]) будет выполнена.
Как уже упоминали другие, вы не можете делать то, что хотите, используя [114604]*/30[114605], так как эти значения превышают значение этого конкретного временного поля в cron.
Вы можете дополнительно настроить приведенный выше пример, если вам нужно перекосить его на 30 минут, либо настроив крон (например, используя 30 вместо 0), либо добавив 30 к условному блоку.[114145].