proc является виртуальной файловой системой, таким образом, я не полагался бы ни на какую информацию о статусе файла.
Время начала процесса расположено в/proc/PID/stat столбце 22. Это дано в миге после начальной загрузки системы. Для преобразования его в секунды, необходимо разделить его на sysconf(_SC_CLK_TCK)
который является 100 для большинства систем (но не все!).
Для получения времени начальной загрузки системы, Вы определяете текущее время работы в секундах, которое является первым значением/proc/uptime.
При наличии тех двух чисел, Вы вычитаете первое из второго и Вы добираетесь, число секунд передало начиная с запуска программы.
Пример (для гибридного языка):
PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF
Примечание: этот простой пример не работает если pidof
возвраты multipe PIDs.
Мне нравится использовать column
команда с -t
опция для выравнивания столбцов в хорошую таблицу:
column -t /etc/fstab
proc /proc proc nodev,noexec,nosuid 0 0
/dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1
/dev/disk/by-label/Home /home ext4 defaults 0 0
#!/bin/bash
# usage: fstabalign [FILE]
# This script will output fstab or other file as column aligned.
# It will not alter blank lines or #hash comments.
if [ -z "$1" ]; then
FILE=$(cat /etc/fstab)
else
FILE=$(cat "$1")
fi
# Separate the file contents into aligned and unaligned parts.
OUT_ALIGNED=$(echo "$FILE" | sed 's/^\s*#.*//' | nl -ba | column -t)
OUT_UNALIGNED=$(echo "$FILE" | sed 's/^\s*[^#].*//' $src | nl -ba)
# Remerge aligned and unaligned parts.
while read; do
line_aligned="$REPLY"
read -u 3; line_unaligned="$REPLY"
line_aligned=$( echo "$line_aligned" | sed 's/\s*[0-9]*\s*//')
line_unaligned=$(echo "$line_unaligned" | sed 's/\s*[0-9]*\s*//')
echo "$line_aligned$line_unaligned"
done < <(echo "$OUT_ALIGNED") 3< <(echo "$OUT_UNALIGNED")
Править:
А-ч, не заметил Ваше редактирование Vim до сих пор.
Альтернатива могла быть должна поместить что-то вроде этого в сценарий.
Это идет как это:
column
и используйте -e
для хранения пустых строк сохраните во временный файл 1.paste
с -d'\0'
отбрасывать пробелы вначале.Сохраните в файл, chmod +x script_file
и выполненный как ./script_file
. Дополнительно укажите fstab
файл ./script_file /path/to/fstab/file
.
Взгляды хорошо? Затем ./script_file > /etc/fstab
#!/bin/bash
src="/etc/fstab"
[[ "$1" ]] && src="$1"
[[ -r "$src" ]] || exit 1
tmp1="$(mktemp)" || exit 1
tmp2="$(mktemp)" || exit 1
# Filter out comments and pipe them through column with -e
# Save to tmp1
sed 's/^[ \t]*#.*//' "$src" | column -et > "$tmp1"
# Filter out tab lines and save to tmp2
sed 's/^[ \t]*[^#].*//' "$src" > "$tmp2"
# merge
paste -d'\0' "$tmp1" "$tmp2"
rm "$tmp1" "$tmp2"
Vim:
Вы могли использовать сценарий Vim. Это - переписывание от подобной вещи...
:FmtFstab
#=
также отформатирован. (Таким образом, если Вы комментируете fstab строку и хотите отформатированный, использовать #=
в начале строки. Никакие пробелы после #=
и запись!).Добавьте к файлу сценария, который загружается, или загрузите его вручную
:so file_name.vim
Когда файл, открытый в Vim, просто скажите :FmtFstab
, и это отформатировано. Также заголовок форматов соответственно.
(У меня также есть сценарий, который вставляет или список UUID, если это представляет интерес.)
" Split string by pattern
" Return array/List in form : [ length, [len_match1, len_match2, ...] ]
fun! s:StrSplit2Widths(line, pat)
let lst=split(a:line, a:pat)
call map(lst, 'strlen(v:val)')
return [len(lst), lst]
endfun
" Generate a string based on a "widths" list
" @widths: widths to use for each entry in list (format as from
" s:StrSplit2Widths)
" @lst : list with text to be printed according to widths
fun! s:WidthFmtList(widths, lst)
let i = len(a:lst) - 1
let lif=""
while i >= 0
let lif = printf("%-*s", a:widths[1][i], a:lst[i]) . " " . lif
let i = i - 1
endwhile
return lif
endfun
" Format current line according to widths
fun! s:FmtBufLine(widths)
let lst=split(getline("."), '\s\+')
if a:widths[0] != len(lst)
return
endif
let lif = s:WidthFmtList(a:widths, lst)
call setline(line("."), lif)
endfun
fun! <SID>:FormatFstab(...)
" Comments to include
let incmagic = "#="
" Header
let hdr = "# <file system> <mount point> <type> <options> <dump> <pass>"
" Base widths are based on header
let widths = s:StrSplit2Widths(hdr, '>\zs\s*\ze<')
" Get all lines (this can be expanded to only do ranges)
let lines = getline(1, line("$"))
" Remove all lines not matching pattern
call filter(lines, 'v:val =~ "^\\s*\\([^#]\\|' . incmagic . '\\)"')
" Calculate width for each column
for line in lines
let lw = s:StrSplit2Widths(line, '\s\+')
while lw[0] < widths[0]
call add(lw[1], 0)
let lw[0] = lw[0] + 1
endwhile
call map(widths[1], 'lw[1][v:key] > v:val ? lw[1][v:key] : v:val')
endfor
" Format each line matching pattern
silent exec ':g/^\s*\(' . incmagic . '\|[^#]\)/ call s:FmtBufLine(widths)'
" Format header
let hlst = split(hdr, '>\zs\s*\ze<')
silent :%s/^\s*#\s*<file system>.*/\=s:WidthFmtList(widths, hlst)
endfun
" ex command
command! -nargs=0 -bar FmtFstab call <SID>:FormatFstab()
Я на самом деле не предпочитаю выравнивания вообще (просто одиночный пробел). Но это - интересная проблема. Интересно почему column
не имеет опции для этого, походит на идеальный вариант использования...
Выравнивание всего fstab привело бы к очень длинным строкам, по крайней мере, в моем случае, поскольку у меня есть некоторые файловые системы со специальными опциями и также некоторые очень длинные пути устройства диска идентификатором. Таким образом, я записал сценарий, который выравнивает каждый раздел (разделенный на пустые строки или строки комментария) индивидуально.
Используя ./fstab.sh /etc/fstab
:
#!/bin/bash
function push() {
buffer="$buffer"$'\n'"$1"
}
function pop() {
if [ "$buffer" != "" ]
then
echo "$buffer" | column -t
buffer=""
fi
}
buffer=""
while read line
do
if [ "$line" == "" -o "${line:0:1}" == "#" ]
then
pop
echo "$line"
else
push "$line"
fi
done < "$1"
pop
Прежде:
# /etc/fstab: static file system information.
# <fs> <mountpoint> <type> <opts> <dump/pass>
# --- SPECIAL ---
none /dev/shm tmpfs nosuid,nodev,noexec,noatime 0 0
none /tmp tmpfs noatime,nosuid,nodev 0 0
none /var/tmp/portage tmpfs noatime,mode=0750,gid=portage,uid=portage 0 0
# --- INTERNAL ---
# SSD
UUID=fa15678f-7e7e-4a47-8ed2-7cea7a5d037d / xfs noatime 0 0
UUID=529cc283-53bc-4acc-a4d3-f35278d3f2f9 /home xfs noatime 0 0
# HDD
UUID=d7562145-654c-48bb-b8d2-1552a69186f5 /home/TV xfs noatime 0 0
UUID=952b5dee-8d2a-40b2-85f9-5e5092bc1e75 /home/steam xfs noatime 0 0
UUID=4dcb18c3-f3a5-4b03-8877-063c5cd836e4 /home/jn xfs noatime 0 0
UUID=c735614a-f5f3-4232-911f-8a17cb033521 /var/www xfs noatime 0 0
/dev/HDD/windows7 /mnt/windows7 ntfs-3g offset=105906176,noauto,noatime 0 0
# HDD (OLD)
UUID=23deb461-bab5-45b7-9dca-9c2c4cdb4f50 /mnt/HDD/OLD-home xfs noauto,noatime 0 0
UUID=dd1e1eef-b548-4c94-8ebe-99dd7a648cb0 /mnt/HDD/OLD-music xfs noauto,noatime 0 0
UUID=2ae11a11-db04-4d27-a79e-d9b07dd19650 /mnt/HDD/OLD-opt xfs noauto,noatime 0 0
UUID=2abb2a27-2183-488e-8c24-e195ab3dcb5d /mnt/HDD/OLD-portage xfs noauto,noatime 0 0
UUID=3d0030f0-92da-4e66-8e60-369dfc586df7 /mnt/HDD/OLD-portage_tmp xfs noauto,noatime 0 0
UUID=89200c49-2fc2-45ed-81c8-e244b95db7ce /mnt/HDD/OLD-root xfs noauto,noatime 0 0
UUID=caebfb75-6a1c-4ed6-ad2f-d84d80221dc3 /mnt/HDD/OLD-schrott xfs noauto,noatime 0 0
UUID=cabddcee-cf07-4526-b3a3-9270edc9d171 /mnt/HDD/OLD-src xfs noauto,noatime 0 0
UUID=a2e4df4e-8c6d-4217-8889-6f483e872190 /mnt/HDD/OLD-tmp xfs noauto,noatime 0 0
UUID=4dd484f6-4142-45b3-b504-48625de1ab5c /mnt/HDD/OLD-var xfs noauto,noatime 0 0
# ODD
/dev/sr0 /mnt/cdrom auto user,noauto,ro 0 0
# --- EXTERNAL ---
# USB-Boot-Stick
LABEL="boot_key" /boot ext2 noauto,noatime 0 0
LABEL="boot_dos" /mnt/boot/dos vfat noauto,noatime 0 0
LABEL="boot_iso" /mnt/boot/iso ext2 noauto,noatime 0 0
LABEL="live0" /mnt/boot/live0 ext2 noauto,noatime 0 0
LABEL="live1" /mnt/boot/live1 ext2 noauto,noatime 0 0
# iriver Story HD
/dev/disk/by-id/usb-iriver_Story_EB07_3230204E6F76-0:0 /mnt/iriver/knv auto user,noauto,noatime 0 0
/dev/disk/by-id/usb-iriver_Story_SD_3230204E6F76-0:1 /mnt/iriver/ext auto user,noauto,noatime 0 0
# Sandisk Sansa CLIP
UUID=C65F-1E04 /mnt/mp3 auto user,noauto,noatime 0 0
# Eltern-Fernseher
UUID=115BF67A31CB6C02 /mnt/wdtv ntfs-3g locale=en_US.utf8,user,noauto 0 0
UUID=D27A-7C74 /mnt/pvr vfat user,noauto,noatime 0 0
После:
# /etc/fstab: static file system information.
# <fs> <mountpoint> <type> <opts> <dump/pass>
# --- SPECIAL ---
none /dev/shm tmpfs nosuid,nodev,noexec,noatime 0 0
none /tmp tmpfs noatime,nosuid,nodev 0 0
none /var/tmp/portage tmpfs noatime,mode=0750,gid=portage,uid=portage 0 0
# --- INTERNAL ---
# SSD
UUID=fa15678f-7e7e-4a47-8ed2-7cea7a5d037d / xfs noatime 0 0
UUID=529cc283-53bc-4acc-a4d3-f35278d3f2f9 /home xfs noatime 0 0
# HDD
UUID=d7562145-654c-48bb-b8d2-1552a69186f5 /home/TV xfs noatime 0 0
UUID=952b5dee-8d2a-40b2-85f9-5e5092bc1e75 /home/steam xfs noatime 0 0
UUID=4dcb18c3-f3a5-4b03-8877-063c5cd836e4 /home/jn xfs noatime 0 0
UUID=c735614a-f5f3-4232-911f-8a17cb033521 /var/www xfs noatime 0 0
/dev/HDD/windows7 /mnt/windows7 ntfs-3g offset=105906176,noauto,noatime 0 0
# HDD (OLD)
UUID=23deb461-bab5-45b7-9dca-9c2c4cdb4f50 /mnt/HDD/OLD-home xfs noauto,noatime 0 0
UUID=dd1e1eef-b548-4c94-8ebe-99dd7a648cb0 /mnt/HDD/OLD-music xfs noauto,noatime 0 0
UUID=2ae11a11-db04-4d27-a79e-d9b07dd19650 /mnt/HDD/OLD-opt xfs noauto,noatime 0 0
UUID=2abb2a27-2183-488e-8c24-e195ab3dcb5d /mnt/HDD/OLD-portage xfs noauto,noatime 0 0
UUID=3d0030f0-92da-4e66-8e60-369dfc586df7 /mnt/HDD/OLD-portage_tmp xfs noauto,noatime 0 0
UUID=89200c49-2fc2-45ed-81c8-e244b95db7ce /mnt/HDD/OLD-root xfs noauto,noatime 0 0
UUID=caebfb75-6a1c-4ed6-ad2f-d84d80221dc3 /mnt/HDD/OLD-schrott xfs noauto,noatime 0 0
UUID=cabddcee-cf07-4526-b3a3-9270edc9d171 /mnt/HDD/OLD-src xfs noauto,noatime 0 0
UUID=a2e4df4e-8c6d-4217-8889-6f483e872190 /mnt/HDD/OLD-tmp xfs noauto,noatime 0 0
UUID=4dd484f6-4142-45b3-b504-48625de1ab5c /mnt/HDD/OLD-var xfs noauto,noatime 0 0
# ODD
/dev/sr0 /mnt/cdrom auto user,noauto,ro 0 0
# --- EXTERNAL ---
# USB-Boot-Stick
LABEL="boot_key" /boot ext2 noauto,noatime 0 0
LABEL="boot_dos" /mnt/boot/dos vfat noauto,noatime 0 0
LABEL="boot_iso" /mnt/boot/iso ext2 noauto,noatime 0 0
LABEL="live0" /mnt/boot/live0 ext2 noauto,noatime 0 0
LABEL="live1" /mnt/boot/live1 ext2 noauto,noatime 0 0
# iriver Story HD
/dev/disk/by-id/usb-iriver_Story_EB07_3230204E6F76-0:0 /mnt/iriver/knv auto user,noauto,noatime 0 0
/dev/disk/by-id/usb-iriver_Story_SD_3230204E6F76-0:1 /mnt/iriver/ext auto user,noauto,noatime 0 0
# Sandisk Sansa CLIP
UUID=C65F-1E04 /mnt/mp3 auto user,noauto,noatime 0 0
# Eltern-Fernseher
UUID=115BF67A31CB6C02 /mnt/wdtv ntfs-3g locale=en_US.utf8,user,noauto 0 0
UUID=D27A-7C74 /mnt/pvr vfat user,noauto,noatime 0 0
Vim должен работать или emacs. Heck даже нано должен отобразить fstab правильно. Если Вы желаете использовать текстовый редактор GUI затем, Вы могли бы попробовать gedit. Если Вы действительно хотите поместить свой fstab в редактора онлайн затем, Вы могли бы использовать документы Google (и затем скопировать вставку назад).
Удостоверьтесь, что Вы используете вкладки для интервала fstab и не одиночных пробелов. Это могло вызвать несоответствия, особенно при использовании и того, и другого.
Возможно, что это выглядит броским, потому что окно оболочки не является достаточно большим для приспосабливания всего текста в строке.