Кто-нибудь может разобрать этот оператор unix grep и awk?

Это ошибка в systemd, и она исправлена ​​в systemd 238 и, возможно, в более ранних версиях.

[root@866d9b9835e0 system]# systemctl status foobar
* foobar.service - foobar
   Loaded: loaded (/etc/systemd/system/foobar.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sun 2018-04-01 21:06:21 UTC; 14min ago
  Process: 143 ExecStart=/usr/bin/false (code=exited, status=1/FAILURE)
 Main PID: 143 (code=exited, status=1/FAILURE)

Apr 01 21:06:21 866d9b9835e0 systemd[1]: foobar.service: Service hold-off time over, scheduling restart.
Apr 01 21:06:21 866d9b9835e0 systemd[1]: foobar.service: Scheduled restart job, restart counter is at 5.
Apr 01 21:06:21 866d9b9835e0 systemd[1]: Stopped foobar.
Apr 01 21:06:21 866d9b9835e0 systemd[1]: foobar.service: Start request repeated too quickly.
Apr 01 21:06:21 866d9b9835e0 systemd[1]: foobar.service: Failed with result 'exit-code'.
Apr 01 21:06:21 866d9b9835e0 systemd[1]: Failed to start foobar.
[root@866d9b9835e0 system]# systemctl --version
systemd 238
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN +PCRE2 default-hierarchy=hybrid

Вы можете обойти эту проблему, избегая использования Restartв systemd.

0
29.10.2019, 12:22
1 ответ
  • ls -lrt:перечисляет не -аргументы каталога и содержимое аргументов каталога в формате long в rвечное tвремя (время модификации )порядок (так что от самого старого к самому новому ). Должно было быть ls -lrtd --.
  • $sTmpPath/$1*:должно было быть"$sTmpPath/$1"*:намерение состояло в том, чтобы перечислить файлы в $sTmpPath, имя которых начинается с $1, я полагаю.
  • grep ^-. Лучше как grep '^-', так как ^особенный в нескольких оболочках. Сохраняет строки, начинающиеся с -. В выводе ls -lэто строки для обычных файлов, за исключением файлов любого другого типа (каталог, символическая ссылка, сокет... ). Это также может дать ложные срабатывания, если некоторые имена файлов или цели символических ссылок содержат символы новой строки.
  • grep -v grep. Исключить строки, содержащие grep. Возможно, тот, кто это написал, имел в виду трюк с ps | grep -v grep. Здесь нет смысла.
  • head -1. Древняя формаhead -n 1:выбирает первую строку ввода. Итак, строка для самого старого совпадающего файла.
  • BEGIN{FS = "/"}:установите разделитель полей awk на /. Для этого лучше использовать -F/.
  • {print $NF}:печатает последнее/-поле с разделителями, то есть часть строки после последнего /, то есть имя файла. Обратите внимание, что awkможет выполнять работу grepи head.

Таким образом, цель сценария состоит в том, чтобы сообщить о самом старом обычном файле в $sTmpPath, имя которого начинается с содержимого $1.

Можно упростить и частично исправить до:

ls -nrtd -- "$sTmpPath/$1"* | awk -F/ '/^-/ {print $NF; exit}'

Здесь используется -nвместо -l, чтобы избежать ненужного преобразования uid/gids в имя пользователя/группу.

Обратите внимание, что предполагается, что ни одно из имен файлов или целей символической ссылки не содержит символов новой строки.

С zshвы просто используете oldest=($sTmpPath/$1*(.Om[1]:t)).

3
28.01.2020, 02:22

Теги

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