Как уничтожить процесс, дающий его за многие секунды до выполнения принудительного уничтожения?

Самый легкий способ обойти его состоит в том, чтобы установить полномочия доли на сервере, чтобы быть миром, перезаписываемым (0777). На клиенте (Ваше встроенное устройство) устанавливает umask пользователя на 0000. Также удалите no_root_squash опция. Вы хотите root_squash на. Этот корень поворота в nobody пользователь. Можно затем считать и записать любой файл, созданный на доле как любой пользователь в системе сервера.

ПРЕДУПРЕЖДЕНИЕ
То, что я описал, является чрезвычайно небезопасной конфигурацией, таким образом, я высоко препятствую выполнению этого для чего-либо кроме закрытой, частной сети.

5
31.10.2012, 15:09
2 ответа

Лучший способ сделать это (которые предотвращают уничтожение того же PID для другого процесса):

 function kill_gracefully() {  
    pid=$1; [[ -z $pid ]] && return;  # check arg
    kill $pid; # kill once

    i=0;    
    while kill -0 $pid; do  # while pid is alive
       sleep 0.1;      
       ((i+=1));  # count ++
       if [[ $i -gt 10 ]];then    # wait for 10 secs at most
           kill -9 $pid;          # kill if timeout
           break;  
       fi;
    done;     
}

Вышеупомянутый метод может перестать работать в тяжелой загруженной системе (это часто разветвляется),

2
27.01.2020, 20:42
kill -- "$pid"; sleep 10; kill -s KILL -- "$pid"

Если на debian основывал систему:

echo "$pid" | start-stop-daemon --pidfile /dev/stdin --stop --oknodo --name "$process_name" --user "$user" --retry 10

Который позволяет Вам указывать соответствие критериям (как имя пользователя и название команды), чтобы не уничтожать неправильный процесс в случае, если pid был снова использован.

0
27.01.2020, 20:42
  • 1
    , я добавил бы дополнительные проверки после sleep, возможно с ps чтобы удостовериться, что процесс все еще, и pid все еще присвоен тому же процессу. –  rahmu 31.10.2012, 15:58
  • 2
    @rhamu, Никакая потребность проверить, произошло ли это. Выполнение уничтожения на существующем pid безопасно, уничтожение просто перестанет работать. Проверка это - тот же процесс, будет основана на эвристике. Это будет возможно к определенному уровню уверенности в большинстве случаев, но не гарантируемое в большинстве случаев. –  Stéphane Chazelas 31.10.2012, 16:08
  • 3
    @StephaneChazelas можно, по крайней мере, проверить, что он не был повторно присвоен несвязанному процессу путем проверки командной строки и родителя. Это может произвести ложные положительные стороны и ложные отрицательные стороны, но это менее опасно в целом. спасибо –  Gilles 'SO- stop being evil' 01.11.2012, 00:36
  • 4
    @Gilles. Да, как я сказал, это будет зависеть от случая. Например, командная строка одного процесса может действительно измениться через вызов на execve(2) и ppid также, если родитель умирает. Посмотрите мой start-stop-daemon ответ для проверки имени пользователя и названия команды. –  Stéphane Chazelas 01.11.2012, 09:07

Теги

Похожие вопросы