Вам даже не нужно проверять, работает ли emacs. emacsclient
может запустить демон emacs, если он еще не запущен. От emacsclient (1)
:
-a, --alternate-editor=EDITOR
if the Emacs server is not running, run the specified editor
instead. This can also be specified via the `ALTERNATE_EDITOR'
environment variable. If the value of EDITOR is the empty
string, run `emacs --daemon' to start Emacs in daemon mode, and
try to connect to it.
Я использую псевдоним ge
для редактирования файлов, определенный следующим образом:
alias ge="emacsclient -c -n --alternate-editor=\"\""
-121--78633- В большинстве случаев необходимо удалить профиль браузера.
Большинство браузеров имеют команду очистки частных данных. Бывает иногда, что вводится новый механизм места хранения и кнопка «очистить частные данные» не обновляется (например, я, кажется, вспоминаю, что в первые дни HTML5 локального места хранения, были браузеры, которые его реализовывали, но предлагали только кнопку очистки cookie, а не локальное место хранения). Если браузер не доверяет стиранию личных данных, можно удалить весь профиль.
Удаление всей системы нецелесообразно, по крайней мере, если вы выполнили обычный просмотр и установку и не приняли установку встроенных подключаемых модулей кода, которые могут получить доступ к компьютеру за пределами изолированной программной среды браузера.
Обратите внимание, что удаления всей системы может быть недостаточно, если вы активировали любой вид онлайн-синхронизации (например, через аккаунт Google). В этом случае необходимо удалить или прекратить использование учетной записи в Интернете.
-121--243222-Это невозможно в целом. Это может быть возможно в вашем конкретном случае.
Сразу после выполнения фоновой команды идентификатор процесса может быть обнаружен из родительского . Если вы выполняете команду переднего плана (дочерний объект мастер-программы), а эта команда, в свою очередь, выполняет фоновую команду (внук мастер-программы), мастер-программа не имеет прямой видимости на своем внуке: все, что она знает, это запуск дочернего процесса, который теперь вышел.
Ядро отслеживает child→parent отношения процессов. Можно запустить ps -o ppid = -p $ pid
, чтобы увидеть идентификатор процесса родительского процесса процесса с идентификатором $ pid
. Ядро не отслеживает бабушку и дедушку процесса. Кроме того, если родитель умирает, процесс принимается init (процесс номер 1), поэтому его идентификатор родительского процесса будет равен 1 с этого момента.
Существует несколько других унаследованных атрибутов процесса, которые можно отслеживать. Однако внук может развестись с любым из этих атрибутов. Если внук предназначен для запуска в качестве демона, он, вероятно, попытается максимально изолировать себя (либо от промежуточного ребенка, либо от самого внука), чтобы он не был привязан к вашему интерактивному сеансу и не рисковал попасть ни в что, происходящее с этим сеансом.
Можно искать процессы в той же группе процессов, что и текущий процесс ( ps -o pgid =
)). Это приведет к захвату любого другого процесса, запущенного в той же группе процессов,но, наоборот, пропустите внука, если он работает в собственной группе процессов из-за вызова setpgid
или setpgrp
в потомке или внуке, что демоны и делают.
Можно искать процессы в том же идентификаторе сеанса, что и текущий процесс ( ps -o sid =
). Это приведет к перехвату любого другого процесса, запущенного в пределах того же идентификатора сеанса, но, наоборот, пропустит внука, если он запускается в собственном сеансе из-за вызова setsid
в потомке или внуке, что демоны и делают.
Можно открыть временный файл и найти процессы с открытым файлом ('fuser «$ tmpfile»). Это более надежно, поскольку процессы, запущенные только из части главного процесса, в которой был открыт этот файл, не будут улавливаться другими компонентами главного процесса. Тем не менее, как и другие решения, он пропустит внука, если он или промежуточный потомок закрыл файловые дескрипторы, которые он не использовал, что демоны сделать.
Большинство демонов имеют опцию командной строки, чтобы оставаться на переднем плане. Затем можно запустить демон --foreground & daemon_pid=$!
, и вы должны принять меры предосторожности, чтобы избежать захвата демона при выходе из сеанса ( nohup daemon --foreground daemon.log 2 > & 1 &
является хорошим началом).
du -shm /var/vmail/mailboxes/domain/*/mail | awk -F '[ /]' '{ print $1, $7 }'
При вводе из du
в указанном вами формате это будет производить
80 USER1
150 USER2
220 USER3
Программа awk
просто выбирает соответствующие поля из вывода du
. Он интерпретирует каждую строку как поля, разделенные пробелами или косой чертой.
awk -F '[ /]' '{ print $1, $(NF - 1) }'
также будет работать.
Чтобы передать это в JSON, используйтеjq
:
du -shm /var/vmail/mailboxes/domain/*/mail |
awk -F '[ /]' '{ print $1, $7 }' |
jq -sR 'split("\n")[0:-1] | map(split(" ")) | map({(.[1]):.[0]}) | add'
Это даст
{
"USER1": "80",
"USER2": "150",
"USER3": "220"
}
Выражение jq
сначала разбивает ввод на отдельные элементы массива (по одному на строку ввода ), а затем снова разбивает их по пробелам на подмассивы. На данный момент имеем
[
[
"80",
"USER1"
],
[
"150",
"USER2"
],
[
"220",
"USER3"
]
]
После этого создаются объекты со вторым элементом в каждом подмассиве в качестве ключа и первым в качестве значения:
[
{
"USER1": "80"
},
{
"USER2": "150"
},
{
"USER3": "220"
}
]
add
в конце дает нам окончательный результат.
попробуй
du -sm /var/vmail/mailboxes/domain/*/mail |
sed 's:/var/vmail/mailboxes/domain/::; s:/mail::'
где
s:/mail::
ничем не заменит /mail
перейти к json
du -sm /var/vmail/mailboxes/domain/*/mail |
sed 's:/var/vmail/mailboxes/domain/::; s:/mail::' |
awk 'BEGIN { sep="{" ;} { printf "%s \"%s\":%s",sep,$2,$1; sep="," } END { printf "}\n"}'
Это немного сложно сделать с sed
. Однако вот закомментированное предложение, которое работает с GNU sed:
parse.sed
s|([^ ]+).*/([^/]+)/.*| "\2" : \1,| # Extract size and name in json-format
1h; 1!H # Correctly add them to hold-space
$ {
z # Clear pattern-space
s/^/\{/ # Prepend start-curly-brace
G # Fetch formatted json from hold-space
s/,$// # Remove last comma
s/$/\n\}/ # Append end-curly-brace
p # Print
}
Запустите это так:
du -shm /var/vmail/mailboxes/domain/*/mail | sed -Enf parse.sed
Или в виде одного -вкладыша:
du -shm /var/vmail/mailboxes/domain/*/mail |
sed -Ene 's|([^ ]+).*/([^/]+)/.*| "\2" : \1,|;1h;1!H;${z;s/^/\{/;G;s/,$//;s/$/\n\}/;p}'
Выход в обоих случаях:
{
"USER1" : 80,
"USER2" : 150,
"USER3" : 220
}
jq
довольно хорошо работает с необработанным текстом -, т.е. с флагом -R
, например.:
du -sm /var/vmail/mailboxes/domain/*/mail |
jq -R '
split(" ") |
.[0] as $size | # Remember size
.[1] | split("/") |.[-2] as $name | # Extract username
{ ($name) : ($size) } # Compose object
'
Дает вам:
{
"USER1": "80"
}
{
"USER2": "150"
}
{
"USER3": "220"
}
Чтобы объединить объекты, используйте второй jq
вызов:
... | jq -s add
Выход:
{
"USER1": "80",
"USER2": "150",
"USER3": "220"
}
Или в компактном режиме:
... | jq -sc add
Выход:
{"USER1":"80","USER2":"150","USER3":"220"}