Вылетает ли rc.local?

С помощью следующих команд вы можете найти все файлы, содержащие строку:

$ grep -lr Hello directoryname

grep ищет строки (название происходит от g/re/p, который вы используете в редакторе ed, чтобы "g" глобально искал регулярное выражение "re" и "p" печатал совпадающие строки).

Команда -l означает "перечислить только подходящие файлы", обычно показывается имя файла с подходящей строкой (BTW: если указан только один файл, его имя обычно подавляется).

Параметр -r означает "искать рекурсивно".

Теперь у вас есть имена файлов, вам нужно отделить имя файла, поскольку вам нужно только имя каталога, содержащего совпадающие файлы. Это можно сделать, добавив конвейер с помощью sed (потоковый редактор):

$ grep -lr Hello directoryname | sed 's:/[^/]*$::'

Символ s означает substitute, за ним следует образец соответствия и текст замены. [^/] означает "любой символ, исключая /". * означает ноль или более из предыдущего объекта. $ означает "совпадение с концом строки". Таким образом, все символы, не являющиеся косой чертой в конце строки, и предшествующий слэш (который является первым символом в шаблоне совпадения) заменяется пустой строкой (так как текст замены пуст).

Это может привести к тому, что один каталог будет показан несколько раз, если в нем есть несколько файлов, содержащих искомую строку. Это можно решить, расширив конвейер еще раз:

$ grep -lr Hello directoryname | sed 's:/[^/]*$::' | uniq

uniq удаляет последовательно дублирующиеся строки, оставляя уникальные строки (отсюда и название).

0
28.02.2018, 19:48
1 ответ

rc.localмало что делает, кроме запуска вашего кода.

Преимущество systemdзаключается в том, что у него есть возможность перезапустить ваш код в случае сбоя, чего rc.localнет.

Так что, если вы не можете предотвратить повторный сбой вашего кода, возможно, вы можете спроектировать его так, чтобы он хотя бы имел шанс работать правильно, если он будет перезапущен после такого сбоя.

0
28.01.2020, 04:30

Теги

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