Можно попробовать Получением Вещей GNOME (сократил GTG). Это поддерживает задачи меток с несколькими тегами и позволяет Вам выполнению запросов на основе тегов.
Например, !not @money !not @1
покажет задачи, которые не являются связанными деньгами или имеют высокий приоритет.
Я использую этот @1 тег для первоочередных задач, @2 для задач среднего приоритета и @3 для низкоприоритетных задач, но Вы свободны выбрать другую систему меток для приоритета.
GTG имеет сборку в календаре для выбора, запускаются/даты истечения срока.
В данный момент Вы не можете вставить таблицы, изображения, видео или математические формулы, но ссылки автоматически создаются при вставке того.
В конце этого месяца будет выпущена новая версия GTG, но я предлагаю, чтобы Вы попробовали текущую версию (0.2.9), который уже действительно хорош (по крайней мере, для меня).
Один подход мог быть должен использовать пространства имен PID:
Загрузите свою систему с a init=/some/cmd
как параметр ядра, где /some/cmd
разветвляет процесс в новом пространстве имен (CLONE_NEWPID
) и выполнения /sbin/init
в нем (это будет иметь PID 1 в том новом пространстве имен и pid 2 в корневом пространстве имен), затем в родителе, выполняют Вашу "программу".
Вы, вероятно, захотите способ управлять Вашей программой так или иначе (TCP или АБСТРАКТНЫЙ сокет Unix, например).
Вы, вероятно, захотите к mlock свою программу в памяти и закроете большинство ссылок на файловую систему так, чтобы это ни на что не полагалось.
Тот процесс не будет замечен от остальной части системы. Остальная часть системы будет в действительности работать как в контейнере.
Если тот процесс умрет, то ядро запаникует, который дает Вам дополнительную гарантию.
Неудобный побочный эффект, хотя то, что мы не будем видеть потоков ядра в выводе ps
.
Как подтверждение концепции (использующий этот прием для начальной загрузки копию системы в qemu виртуальной машине):
Создайте a /tmp/init
как:
#! /bin/sh -
echo Starting
/usr/local/bin/unshare -fmp -- sh -c '
umount /proc
mount -nt proc p /proc
exec bash <&2' &
ifconfig lo 127.1/8
exec socat tcp-listen:1234,fork,reuseaddr system:"ps -efH; echo still running"
(Вам нужно unshare
от последней версии util-linux (2.14)). Выше мы используем socat
как "программа", которая просто отвечает на соединениях TCP на порте на 1234 с выводом ps -efH
.
Затем загрузите свой VM как:
kvm -kernel /boot/vmlinuz-$(uname -r) -initrd /boot/initrd.img-$(uname -r) \
-m 1024 -fsdev local,id=r,path=/,security_model=none \
-device virtio-9p-pci,fsdev=r,mount_tag=r -nographic -append \
'root=r rootfstype=9p rootflags=trans=virtio console=ttyS0 init=/tmp/init rw'
Затем мы видим:
Begin: Running /scripts/init-bottom ... done.
Starting
[...]
root@(none):/# ps -efH
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:24 ? 00:00:00 bash
root 4 1 0 14:24 ? 00:00:00 ps -efH
root@(none):/# telnet localhost 1234
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
UID PID PPID C STIME TTY TIME CMD
root 2 0 0 14:24 ? 00:00:00 [kthreadd]
root 3 2 0 14:24 ? 00:00:00 [ksoftirqd/0]
[...]
root 1 0 2 14:24 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 204 1 0 14:24 ? 00:00:00 /usr/local/bin/unshare -fmp -- sh -c umount /proc mount -nt proc p /proc exec bash <&2
root 206 204 0 14:24 ? 00:00:00 bash
root 212 206 0 14:25 ? 00:00:00 telnet localhost 1234
root 213 1 0 14:25 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 214 213 0 14:25 ? 00:00:00 socat tcp-listen:1234,fork,reuseaddr system:ps -efH; echo still running
root 215 214 0 14:25 ? 00:00:00 sh -c ps -efH; echo still running
root 216 215 0 14:25 ? 00:00:00 ps -efH
still running
Connection closed by foreign host.
root@(none):/# QEMU: Terminated
Не уверенный, если это - конечное решение или если это - лучший способ сделать это. Мои мнения:
Изменить init
так как это - первый процесс, если это умирает, все другие умирают также. Таким образом, Ваша машина только будет применима с ним.
Создайте модуль ядра и загрузите критические модули в зависимости от него (если он будет уничтожен, то он вызовет цепную реакцию как init
пример).
Измените ядро для игнорирования, уничтожают запросы на определенный процесс.
Следует иметь в виду, что последние два будут работать в привилегированном режиме (который очень ограничен с точки зрения, освобождает и так один). Изменение init
будет работать в пространстве пользователя, разрешающем Вам использовать много функций его.