Что-то, что не может быть остановлено без причинения катастрофического ущерба его работе, должно запускаться не как "служба", а как -сценарий задания или процесс.
То, что вы пытаетесь сравнить с ожиданием того, что Интернет прекратит запросы с вашего веб-сайта, прежде чем позволить systemctl stop apache2
завершиться.
Для локальной машины, если вам нужно выключить машину, вы все равно не сможете продолжить запись файла. Если вы решили это сделать, то вы хотитеsystemctl
завершить службу без ожидания.
Решение будет найдено в вашей дорожной карте продукта, а именно: позволить разработчикам сообщать менеджеру по продукту, какой пользовательский опыт невозможен, а какой должен быть вместо этого.
Я отвечаю на это следующими предложениями, не зная содержания вашего скрипта hltv_start.sh
, потому что вы им не поделились. Таким образом, это не должно быть центральным в вашем вопросе. Соответственно, кроме этих мозговых штурмов, я не могу быть конкретным...
Рассмотрим:
systemctl stop
после , когда вы закончите запись файла. wait
, чтобы завершить процесс записи перед выходом. systemctl
для завершения этого процесса, который является своего рода силовым -ходом, который должен остановить процесс в середине -файла. wait
, для завершения, если это даже необходимо.wait
, то теоретически вы могли бы systemctl stop
свою службу разрешить завершение операции записи, что, я думаю, и является вашей целью. Вы можете использовать файл временных меток, который sudo создает для -пользователя, чтобы узнать, как давно этот пользователь использовал команду sudo; если это больше, чем настроенныеtimestamp_timeout
(по умолчанию 5 минут ), тогда для нового sudo потребуется пароль.
Файл пользователя -создается в/var/run/sudo/ts/
(в моей системе ). Его формат частично описан в man sudoers
, а из исходников timestamp.c и check.h видно, что он состоит из нескольких записей, описываемых структурой struct timestamp_entry_v1
или новее struct timestamp_entry
.
Версия git новее, чем исходные коды, соответствующие моей старой -системе ish, поэтому я использую старую структуру версии 1. Возможно, вам понадобится более новая версия 2 с дополнительным полем.
Вот минимальная программа на C для создания дампа записей для жесткого -проводного пользователя:
/* https://unix.stackexchange.com/a/595473/119298
* struct from
* https://github.com/sudo-project/sudo/blob/master/plugins/sudoers/check.h
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define TS_VERSION 1
/* Time stamp entry types */
#define TS_GLOBAL 0x01
#define TS_TTY 0x02
#define TS_PPID 0x03
#define TS_LOCKEXCL 0x04
/* Time stamp flags */
#define TS_DISABLED 0x01 /* entry disabled */
#define TS_ANYUID 0x02 /* ignore uid, only valid in the key */
struct timestamp_entry {
unsigned short version; /* version number */
unsigned short size; /* entry size */
unsigned short type; /* TS_GLOBAL, TS_TTY, TS_PPID */
unsigned short flags; /* TS_DISABLED, TS_ANYUID */
uid_t auth_uid; /* uid to authenticate as */
pid_t sid; /* session ID associated with tty/ppid */
struct timespec ts; /* timestamp (CLOCK_MONOTONIC) */
union {
dev_t ttydev; /* tty device number */
pid_t ppid; /* parent pid */
} u;
};
void main(int argc, char **argv){
struct timestamp_entry entry;
struct timespec now;
int fd = open("/var/run/sudo/ts/meuh",O_RDONLY);
if(fd<0)exit(1);
clock_gettime(CLOCK_MONOTONIC, &now);
while(read(fd,&entry,sizeof(entry))==sizeof(entry)){
printf("type=%d flags=%d uid=%d sid=%d elapsedtime=%d\n",
entry.type, entry.flags, entry.auth_uid, entry.sid,
entry.ts.tv_sec-now.tv_sec);
}
exit(0);
}
Компиляция и запуск этого корневого каталога setuid в моей системе дали мне такие строки, как
type=4 flags=0 uid=0 sid=0 elapsedtime=-4763540
type=2 flags=1 uid=1000 sid=7003 elapsedtime=-4763540
type=2 flags=0 uid=1000 sid=4378 elapsedtime=-12
Первая запись типа 4 используется для блокировки записей. Другие линии могут быть на -tty и так далее. флаги 1 предназначены для отключенной записи (, например, из-заsudo -k
). Последняя строка была для моего uid 1000, выполнившего команду sudo 12 секунд назад из процесса 4378. Поскольку это меньше 5 *60 секунд, дальнейшие sudo еще не нуждаются в пароле.