Форум русскоязычного сообщества Ubuntu


Автор Тема: c - killall (убить надо выход сигнал порядок.)  (Прочитано 923 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
// kall.c
// victor00000 (c) 2018.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
// ~$ gcc kall.c -o kall
// ~$ ./kall &
// ~$ killall -w kall

void ah (int a){
printf ("Killall: My exit programm %d\n",a);
exit (a);
}



int main (){
signal (SIGTERM, &ah );
while (1){
sleep (1);
}
return 0;
}

команды:
5:L~$
5:L~$ ./kall &
[1] 9419
5:L~$
5:L~$ killall -w kall
Killall: My exit programm 15
[1]+  Exit 15                 ./kall
5:L~$
5:L~$
Wars ~.o

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Код: (bash) [Выделить]
vel@T14:~$ ./kall &
[1] 2976
vel@T14:~$ kill $(pidof kall)
Killall: My exit program 15
vel@T14:~$ wait 2>/dev/null
vel@T14:~$

— это?

И можно
Код: (bash) [Выделить]
vel@T14:~$ ./kall &
[1] 3008
vel@T14:~$ ./kall &
[2] 3009
vel@T14:~$ ./kall &
[3] 3010
vel@T14:~$ ./kall &
[4] 3011
vel@T14:~$ TO_KILL=$(pidof kall)
vel@T14:~$ kill $TO_KILL && wait $TO_KILL 2>/dev/null
Killall: My exit program 15
Killall: My exit program 15
Killall: My exit program 15
Killall: My exit program 15
vel@T14:~$

Пользователь добавил сообщение 03 Июля 2018, 13:54:54:
Или так:
Код: (bash) [Выделить]
vel@T14:~$ sh -c './kall &'
vel@T14:~$ sh -c './kall &'
vel@T14:~$ killall -w kall
Killall: My exit program 15
Killall: My exit program 15
vel@T14:~$
« Последнее редактирование: 03 Июля 2018, 13:54:54 от inkblack »
Делюсь знаниями, но их у меня мало!

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
А башщу тоже.
#!/bin/bash
# kall.sh
# victor00000 (c) 2018.
# ~$ chmod +x kall.sh
# ~$ ./kall.sh &
# ~$ killall -w kall.sh

t=`mktemp -u`.pid


trap "cat $t | xargs -I {} kill {};rm $t;echo my exit 15; exit 15" TERM

while true
do
sleep 1
done &
p=$!
echo $p > $t
wait $p
Wars ~.o

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Код: (bash) [Выделить]
t=`mktemp -u`.pidплохо, потому что

1)
Цитировать
man mktemp:

...
-u, --dry-run
    do not create anything; merely print a name (unsafe)

2)
`mktemp -u`.pid   -  такой файл может быть уже ЕСТЬ! И он кому-то нужен.

Лучше
Код: (bash) [Выделить]
t=`mktemp`Создается файл, которого _точно раньше не было_ и который после этого _есть_
Если он после этого есть, его никто не попытается создать заново.


А получить-то что надо?
Делюсь знаниями, но их у меня мало!

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
1:L~$
1:L~$ ls `mktemp`
/tmp/tmp.CeXUlpxWa7
1:L~$ ls `mktemp -u`
ls: cannot access /tmp/tmp.wMeDyGtDqQ: No such file or directory
1:L~$

Wars ~.o

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Правильно,   ls `mktemp`   создаёт файл и показывает его.
Если файл создан, то потом можно сделать   echo $p > $t

А при   ls `mktemp -u`   мы получаем имя файла, которого  точно пока ещё нет.  И   ls <это_имя>   говорит, что файла нет.

НО!   Во втором случае после выполнения   mktemp -u,  но до выполнения   ls   кто-то другой случайно может создать файл с таким именем и записать туда что-то нужное. Получится один файл на два процесса, один процесс будет туда что-то писать, а другой будет это перезаписывать.
Вероятность очень мала, но не 0.
Случится в самый неподходящий момент.
Делюсь знаниями, но их у меня мало!

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
исправил.

t=`mktemp XXXXX.pid -p /tmp`
Wars ~.o

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Я всё-таки не понял, о чем эта тема?

«Смотрите, я сделал такую штуку, и она работает»
или
«Я хочу, чтобы работало так-то и так-то, а оно не работает. Как надо сделать, чтобы работало?»


Но в любом случае, познавательно весьма.
Например:
Цитировать

man killall


...

KNOWN BUGS
       ...

       killall -w  doesn't detect if a process disappears and is replaced by a
       new process with the same PID between scans.

       If processes change their namekillall  may not be able to match them
       correctly.
Жесть.
Делюсь знаниями, но их у меня мало!

Оффлайн victor00000

  • Автор темы
  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
inkblack,
что-бы гугле узнать, а ты тут ненадо пишет.



Пользователь добавил сообщение 03 Июля 2018, 18:52:33:
только смотрящих, а не вопрос и помогите.

« Последнее редактирование: 03 Июля 2018, 18:52:33 от victor00000 »
Wars ~.o

 

Страница сгенерирована за 0.049 секунд. Запросов: 25.