Группирование команд в макросе mutt (проблема с префиксом тега для сложных макросов)

Для этого я разработал следующий однострочник; может быть лучший способ. Регулярное выражение / [b] ash / - это то, что выбирает имя процесса для сопоставления.

ps -ef | awk ' NR == 1 { header = $0; next } { pid[$2] = $0 } /[b]ash/ { toprint[$2] } END { print header; for (i in toprint) { while (i != 1) { split(pid[i], pieces, " "); i = pieces[3]; toprint[i] } } for (i in toprint) { print pid[i] } }'

На самом деле я сначала разработал это как полный сценарий, а затем сжал его до однострочника; вот более читаемая версия:

ps -ef | awk '
NR == 1 {
  header = $0
  next
}
{
  pid[$2] = $0                    # Save all lines of ps -ef in this array, stored by PID
}
/[b]ash/ {                        # Modify this regex to change the filter
  toprint[$2]                     # Designate all these PIDs as "to print"
}
END {
  print header
  for (i in toprint) {            # For each PID designated "to be printed":
    while (i != 1) {
      split(pid[i], pieces, " ")  # Look up the info on that process
      i = pieces[3]               # Set i to the PPID
      toprint[i]                  # Designate that PPID as "to print"
    }                             # Recurse to get the parent of that process, until PID 1 is reached.
  }
  for (i in toprint) {            # Then actually print the data.
    print pid[i]
  }
}'

Пример вывода:

UID        PID  PPID  C STIME TTY          TIME CMD
root     23181 23137  0 15:33 pts/2    00:00:00 sudo su
vagrant  23136 23133  0 15:33 ?        00:00:01 sshd: vagrant@pts/2
root     23182 23181  0 15:33 pts/2    00:00:00 su
vagrant  23137 23136  0 15:33 pts/2    00:00:00 -bash
root      1041     1  0 Jan16 ?        00:00:00 /usr/sbin/sshd
root     23183 23182  0 15:33 pts/2    00:00:00 bash
root     12980     1  0 10:58 ?        00:00:01 /bin/bash /var/cfengine/bin/runalerts.sh
root         1     0  0 Jan16 ?        00:00:01 /sbin/init
root     23133  1041  0 15:33 ?        00:00:00 sshd: vagrant [priv]

Обратите внимание на родительские PID, перечисленные в приведенном выше списке.

0
24.09.2018, 22:59
1 ответ

Я думаю, вы просите более сложный сценарий. Вы не описали, как определить «последний» прибывший файл, поэтому он просто истекает через 5 секунд бездействия файла, поскольку по крайней мере один файл был передан.

  1. Установить флаг = ожидание
  2. Параллельно :всякий раз, когда файл уведомляется, установите флаг = не выполнено _
  3. Подождите, пока флаг == не будет выполнено _

  4. Пусковой контур

    • Дождитесь подключения USB и запустите процесс синхронизации(rsync)
    • Если какие-либо новые файлы были перенесены, установите флаг = не _выполнено
    • В противном случае
      • Если флаг == возможно _выполнено, тогда установите флаг = определенно _выполнено, в противном случае установите флаг = вероятно _выполнено
    • Если нам потребовалось меньше пяти секунд, подождите оставшееся время
  5. Цикл до флага == однозначно _выполнено

Поскольку нам нужен IPC между основным процессом и параллельным inotifywaitпроцессом, я бы рассмотрел реализацию флага в виде файла, возможно, даже набора имен файлов.

Насколько я могу судить, непросто определить, передал ли rsyncновые файлы. Возможно, вам потребуется сравнить содержимое целевого каталога до и после.

0
28.01.2020, 04:13

Теги

Похожие вопросы