How can I parse argument using C?
POSIX предоставляет getopt для анализа аргументов строки команды -.
В системах Linux библиотека GNU C предоставляет расширенную функцию getopt _long , которая позволяет использовать параметры с длинными именами в дополнение к односимвольным -символьным флагам, поддерживаемым простой getopt.
In linux, pressing 'tab' auto fills the command. I would like to have similar functionalities in my utility. How would I program that using C?
Если вы хотите, чтобы ваша программа показывала собственное приглашение и обеспечивала редактирование строк и контекстно-зависимое -автодополнение, загляните в readline .
While developing utilities(of any kind), Is it better to use the functions provided by the linux kernel or continue with those in libc?
Libc — это то, что в любом случае предоставляет вам привязки системных вызовов (, если только вы не пойдете на нелепые крайности, чтобы избежать этого, что обычно включает в себя написание вашего собственного кода на ассемблере и не принесет вам ничего, кроме головной боли ).
Как правило, пользуйтесь услугами высочайшего -уровня, которые позволят вам делать то, что вам нужно, если только у вас нет четких, конкретных и взвешенных причин производительности, говорящих об обратном.
Создайте вместилище (файл, скажем, ~/spool/last_jobrec
), где вы можете регистрировать последнюю метку времени, записанную вашим заданием cron. Сравните его с отметкой времени последней добавленной записи журнала. Когда они разные, отправьте уведомление, когда они идентичны, ничего не делайте.
$ mkdir -p /path/to/spool # choose a place for spool directory.
$
$ cat /myscripts/joberror.sh
#!/bin/bash
touch /path/to/spool/last_jobrec # ensure appropriate permissions
latest_logentry=$(grep --no-messages --no-filename --max-count=1 -e "Too many open files" <(tac /share/logs/access.log))
latest_logstamp=$(cut -d' ' -f1,2 <(echo $latest_logentry))
if [ "$latest_logstamp" != "$(cat /path/to/spool/last_jobrec)" ]; then
echo "$latest_logentry" | mailx -s "Batch Error " to XYZ@gmail.com
echo "$latest_logstamp" >| /path/to/spool/last_jobrec
fi
Не проверено. В частности, я не использую утилиту mailx
.
Замечания:
1)Я предполагаю, что новые записи журнала добавляются в конце файла журнала.
2)Чтобы заполнить переменную last_entrystamp
выше, я использовал выражение, основанное на grep
. Это потому, что я консервативно предполагаю, что ваш файл журнала может содержать другие записи в виде строк, не содержащих строку «Слишком много открытых файлов». Если нет, просто замените строку grep
в скрипте наlatest_logentry=$(tail -1 /share/logs/access.log)