LINUX.ORG.RU

Сигнал о завершении процесса

 , ,


0

1

Предлагаю скрипт, который следит за процессом и после завершения процесса включает музыку.

Когда компиляция ядра уже запущена, то простое решение `make all install && beep` не работает.

Для работы скрипта выясните название процесса. В случае компиляции ядра - это первый в top процесс с именем cc1 или make. Также это может быть браузер icecat, firefox...

$ top
... 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
25329 root      20   0  121120  90716  17752 R  84,2  2,6   0:02.84 cc1         
25167 user      20   0 1909892 271236  84268 R  42,1  7,8   0:15.37 icecat      
...

Так как при компиляции процесс cc1 может останавливаться, в данном примере поиск производится по cc1 или make, то есть `grep 'cc1\|make'`

Листинг bash-скрипта будильника завершения процесса

#!/bin/bash

#play music when no such process

#name of process
pr="${1:-cc1\|make}"
#delay between checks
delay=5

#num - quantity of process with such name as $pr defines
num=`ps aux | grep $pr | wc -l`

# the 1 process is grep so while greater then 1
while [ $num -gt 1 ]
do
  echo 'Process ' $pr ' exists. num: ' $num
  sleep $delay
  num=`ps aux | grep $pr | wc -l`
done

echo 'No process ' $pr
gnome-mplayer '/home/y/Музыка/Katya_Chehova_-_My_Vmeste.mp3'

Скрипт в бесконечном цикле проверяет наличие процесса с именем, указанным в переменной $pr. Для работы скрипта нужно сохранить в файле, например, 1.sh, дать права исполнения и запустить. В следующем примере отслеживаемый процесс - icecat.

$ chmod +x 1.sh

$ ./1.sh
Process  icecat  exists. num:  3
Process  icecat  exists. num:  3
Process  icecat  exists. num:  3
Process  icecat  exists. num:  2
No process  icecat

** (gnome-mplayer:24031): WARNING **: Error retrieving accessibility bus address: org.freedesktop.DBus.Error.ServiceUnknown: The name org.a11y.Bus was not provided by any .service files
GMLIB-Message: after init: position=0,000 length=0,000 start_time=0,000 run_time=0,000 volume=0,00 player=dead media=unknown uri=
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

(gnome-mplayer:24031): GLib-CRITICAL **: Source ID 60 was not found when attempting to remove it

(gnome-mplayer:24031): GLib-CRITICAL **: Source ID 61 was not found when attempting to remove it

(gnome-mplayer:24031): GLib-CRITICAL **: Source ID 62 was not found when attempting to remove it
...
★★

pr='cc1\|make'

pr="${1:-cc1\|make}"

И передавай аргументом, чтобы не переписывать скрипт каждый раз.

r3lgar ★★★★★ ()
Последнее исправление: r3lgar (всего исправлений: 1 )

Когда компиляция ядра уже запущена, то простое решение `make all install && beep` не работает

А такое не сработает:

^Z
bg && wait && beep
?

Deleted ()

Я джва года ждал такой скрипт!

zolden ★★★★★ ()
Ответ на: комментарий от anonymous

fg .., не?

оба варианта работают:

- bg && wait && beep

- fg && beep

sergej ★★★★★ ()

Скрипт в бесконечном цикле проверяет наличие процесса с именем, указанным в переменной $pr.

А чего не по PIDу то?

micronekodesu ★★★ ()
Ответ на: комментарий от micronekodesu

компилируется частями, процесс cc1 останавливается, и запускаются новые. последите за `top` во время сборки `make all nstall`

znavko ★★ ()
Ответ на: комментарий от micronekodesu

в топ вот что http://0x0.st/sLqD.png

подскажите, почему не компилируется?

#  apt-get install dpkg-dev libncurses5-dev  kernel-package fakeroot bzip2 build-essential

# uname -a
Linux asus 4.4.0-119-generic #143+8.0trisquel2 SMP Thu Apr 5 16:24:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# ls /boot
abi-4.4.0-119-generic     grub                          retpoline-4.4.0-119-generic   vmlinuz-4.4.0-119-generic
config-4.4.0-119-generic  initrd.img-4.4.0-119-generic  System.map-4.4.0-119-generic


# apt-cache search linux-source
linux-source-4.4.0 - Linux-libre kernel source for version 4.4.0
linux-source - Linux kernel source with Ubuntu patches
linux-source-4.13.0 - Linux-libre kernel source for version 4.13.0
linux-source-4.8.0 - Linux-libre kernel source for version 4.8.0

# apt-get source linux-source-4.13.0

# ls
linux-hwe-4.13.0  linux-hwe_4.13.0-45.50~16.04.1+8.0trisquel1.dsc  linux-hwe_4.13.0-45.50~16.04.1+8.0trisquel1.tar.gz 

# cd linux-hwe-4.13.0

# make O=/home/user/kernel/mybuild menuconfig

загрузил  конфиг из /boot/config-4.4.0-119-generic, отключил две опции: IRDA и Bluetooth, сохранил конфиг в /home/user/kernel/mybuild/.config

# make O=/home/user/kernel/mybuild 

/bin/bash /home/y/kernel/linux-hwe-4.13.0/scripts/ubuntu-retpoline-extract-one arch/x86/crypto/sha1-mb/sha1_mb_mgr_submit_avx2.o /home/y/kernel/linux-hwe-4.13.0/arch/x86/crypto/sha1-mb/sha1_mb_mgr_submit_avx2.S "";
  AS [M]  arch/x86/crypto/sha1-mb/sha1_x8_avx2.o
/bin/bash /home/y/kernel/linux-hwe-4.13.0/scripts/ubuntu-retpoline-extract-one arch/x86/crypto/sha1-mb/sha1_x8_avx2.o /home/y/kernel/linux-hwe-4.13.0/arch/x86/crypto/sha1-mb/sha1_x8_avx2.S "";
  LD [M]  arch/x86/crypto/sha1-mb/sha1-mb.o
  AS      arch/x86/entry/entry_64.o
Segmentation fault
/home/y/kernel/linux-hwe-4.13.0/scripts/Makefile.build:419: ошибка выполнения рецепта для цели «arch/x86/entry/entry_64.o»
make[3]: *** [arch/x86/entry/entry_64.o] Ошибка 139
/home/y/kernel/linux-hwe-4.13.0/scripts/Makefile.build:589: ошибка выполнения рецепта для цели «arch/x86/entry»
make[2]: *** [arch/x86/entry] Ошибка 2
/home/y/kernel/linux-hwe-4.13.0/Makefile:1055: ошибка выполнения рецепта для цели «arch/x86»
make[1]: *** [arch/x86] Ошибка 2
make[1]: выход из каталога «/home/y/kernel/mybuild»
Makefile:145: ошибка выполнения рецепта для цели «sub-make»
make: *** [sub-make] Ошибка 2

Что не так? все необходимое установлено

znavko ★★ ()

Лови наркомана!

мало того, что прибито гвоздями к гномомузыке,так ещё и слушает шлак всякий.

Используй пгреп - он умеет в регекспы в отличии от пидоф.

И не используй `, это дурной тон. $() тебе в помощь.

anonymous ()
Ответ на: комментарий от anonymous

а ещё лучше в переменной, через which, дабы не было проблем.

anonymous ()
Ответ на: комментарий от znavko

в топ вот что

Так включите отображение PPID (менюшка вызывается через f). ps -ef тоже будет отображать PPID (лень искать как там это в bsd-нотации вызывается).

подскажите, почему не компилируется?

Без понятия вообще, вам виднее раз вы решили ядро пересобрать.

micronekodesu ★★★ ()
20 сентября 2018 г.
#!/bin/bash

#play music when cpu usage lower then X%

#cpu usage lowest level
u=20
#delay between checks
delay=5


function cpu_usage() {
  # Read /proc/stat file (for first datapoint)
  read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
  # compute active and total utilizations
  cpu_active_prev=$((user+system+nice+softirq+steal))
  cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
  sleep 0.05
  # Read /proc/stat file (for second datapoint)
  read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
  # compute active and total utilizations
  cpu_active_cur=$((user+system+nice+softirq+steal))
  cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
  # compute CPU utilization (%)
  cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
  echo ${cpu_util%.*}
}



usage=$(cpu_usage)
until [ $usage -lt $u ]; do
  #usage - current cpu usage percent
  usage=$(cpu_usage)
  echo "CPU usage: " $usage " greater than" $u
  sleep $delay
done

echo 'CPU is free'
mpv '/home/user/Music/Katya_Chehova_-_My_Vmeste.mp3'

znavko ★★ ()
30 ноября 2018 г.

Во время обновления guix процессор может ожидать скачивания файлов,поэтому обновляю скрипт функцией мониторинга принятых TCP-пакетов.

#!/bin/bash

#play music when cpu usage lower than X%
#and TCP incoming traffic is less than Y

#cpu usage lowest level
u=20
#delay between checks of cpu
delay=8
#counter - how many times of cpu low level usage
#makes us know cpu is not using
cnt=5
#delay between counter
delay_c=5
#time tcp usage (seconds) that need to count packages
tcp_time=2
#tcp received packages (that expects as the network is using)
tcp=50

date_start=$(date)

function cpu_usage() {
  # Read /proc/stat file (for first datapoint)
  read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
  # compute active and total utilizations
  cpu_active_prev=$((user+system+nice+softirq+steal))
  cpu_total_prev=$((user+system+nice+softirq+steal+idle+iowait))
  sleep 0.05
  # Read /proc/stat file (for second datapoint)
  read cpu user nice system idle iowait irq softirq steal guest< /proc/stat
  # compute active and total utilizations
  cpu_active_cur=$((user+system+nice+softirq+steal))
  cpu_total_cur=$((user+system+nice+softirq+steal+idle+iowait))
  # compute CPU utilization (%)
  cpu_util=$((100*( cpu_active_cur-cpu_active_prev ) / (cpu_total_cur-cpu_total_prev) ))
  echo ${cpu_util%.*}
}

function inet_usage() {
  #Check received TCP packages
  sec=$1
  time1=$(netstat -A inet -s | grep '[0-9][0-9]* segments received' | awk '{print $1}')
  sleep $sec
  time2=$(netstat -A inet -s | grep '[0-9][0-9]* segments received' | awk '{print $1}')
  diff=$(($time2-$time1))
  echo $diff
}

echo "Start date: " && date

c=$cnt
until [ $c -le 0 ]; do
  cpu_usage=$(cpu_usage)
  until [ $cpu_usage -lt $u ]; do
    #cpu_usage - current cpu usage percent
    echo "CPU usage: " $cpu_usage " greater than" $u
    cpu_usage=$(cpu_usage)
    c=$cnt
    sleep $delay
  done
  inet_usage=$(inet_usage $tcp_time)
  until [ $inet_usage -lt $tcp ]; do
    #inet_usage - quantity of received tcp packages
    echo "Inet usage: " $inet_usage " greater than" $tcp
    inet_usage=$(inet_usage $tcp_time)
    c=$cnt
    sleep $delay
  done
  let c-=1
  echo counter $c from $cnt
  echo sleep $delay_c
  sleep $delay_c
done

echo 'CPU is free'
echo 'Inet is free'
echo "Start date was" $date_start
echo "Now is" && date
mpv '/home/user/Music/two_door_cinema_club_what_you_know_ollaboration_cover.mp3'
znavko ★★ ()
Ответ на: комментарий от znavko

Вы ещё и сопровождаете его :-? Внезапно. Это для себя или всё-таки цели более обширны?

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.