Дешифровка справки 'PS' и 'pstree' с 'кроном' и 'sudo'

Извините за этот выстрел цветного экрана, но я думаю, что он помогает выделить проблему лучше, чем копия и вставка + формат кода:

ps display-auto-brightness

Вот тот же экран в формате кода:

───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep display-
26457 pts/2    S+     0:00 grep --color=auto display-
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep display-
28927 pts/18   S+     0:00 sudo /usr/local/bin/display-auto-brightness
29174 pts/18   S+     0:00 /bin/bash /usr/local/bin/display-auto-brightness
30183 pts/2    S+     0:00 grep --color=auto display-
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree | grep display-
        |-cron---cron---sh---display-auto-br---sleep
        |         |         |         |                 |-bash---sudo---display-auto-br---sleep
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep cron
16031 pts/2    S+     0:00 grep --color=auto cron
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep display
26773 pts/2    S+     0:00 grep --color=auto display
28927 pts/18   S+     0:00 sudo /usr/local/bin/display-auto-brightness
29174 pts/18   S+     0:00 /bin/bash /usr/local/bin/display-auto-brightness
───────────────────────────────────────────────────────────────────────────────

Этим утром после перезагружают задание крона - /etc/cron.d/display-auto-brightness должен был запустить. Я думал, что это никогда не запускалось на, он идет на основе первого раздела.

Я вручную запустил сценарий с sudo /usr/local/bin/display-auto-brightness. Второй раздел показывает как ps возвраты два идентификатора процесса для единственного задания. Oncefor sudo повышение, которое запустило задание и второе для самого сценария.

Существует ли программный способ идентифицировать эти два PIDs как одно задание? Так как причиной является следующий шаг разработки, когда возобновление от приостанавливает, чтобы видеть, выполняет ли единственное задание (не два процесса) уже и уничтожает его при запуске того же задания снова. Это даст моментальную настройку яркости дисплея при возобновлении при свете дня после приостановки в темноте или наоборот.

В третьем разделе я использовал pstree управляйте и обнаруженный задание крона, которое не появилось с ps команда показывает здесь. Почему это?.

В четвертом разделе я передаю по каналу ps вывод через grep использование cron поскольку фильтр и ничто обнаруживаются. Почему это?

В пятом и заключительном разделе я повторяю второй раздел ps a | grep display- вновь подтвердить предыдущие результаты.


Редактирование 1

Я думаю, что выяснил, почему четвертый раздел не показывает cron выполнение. Это из-за состояния обычного пользователя, пока крон работает как корень. Решение состоит в том, чтобы использовать:

$ sudo ps aux | grep cron
root      1122  0.0  0.0  29008  2936 ?        Ss   04:16   0:00 /usr/sbin/cron -f
rick      7273  0.0  0.0  14224  1028 pts/2    S+   17:50   0:00 grep --color=auto cron

Теперь мы видим, что исходная перезагрузка в 4:16 все еще работает под заданием крона. Идентификатор 1122 процесса мог бы быть тем, который должен быть уничтожен, когда возобновление от приостанавливает в будущих изменениях программы. Это все еще не набрасывается на название сценария display-auto-brightness который pstree команда находит.


Отредактируйте 2 Windows Subsystem для настольного ярлыка Linux

При установке значка для вызова сценария удара от рабочего стола Windows 10 Вы получаете более запускающие программы, чем под плоскостью Ubuntu 16.04 и Единица:

$ ps -ef | grep lock-screen
rick     29243 29242  0 17:13 tty1     00:00:00 /bin/bash -c cd && DISPLAY=0:0 /mnt/e/bin/lock-screen-timer
rick     29244 29243  0 17:13 tty1     00:00:00 /bin/bash /mnt/e/bin/lock-screen-timer

Когда Вы используете pstree существует еще больше PID:

$ pstree -gp | grep lock-screen
          |-init(29242,29242)---bash(29243,29242)---lock-screen-tim(29244,29242)---sleep(29777,29242)

В "старом" методе я уничтожил бы lock-screen-timer "29244". Взгляд на ps -aux Я думаю, что должен уничтожить "29243". Взгляд на pstree хотя init родительский процесс должен быть уничтожен, который является "29242".

Дальнейшее тестирование показывает, что Вы не можете уничтожить init PID

Этот снимок экрана показывает, как Вы не можете уничтожить init PID непосредственно. Можно уничтожить, это - ребенок, который заставляет это умирать, но внук и правнук продолжают бежать. Казалось бы, что необходимо уничтожить три PID в соответствии с Windows 10 WSL, когда настольный ярлык используется:

rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep lock-screen
          |-init(30554,30554)---bash(30555,30554)---lock-screen-tim(30556,30554)---sleep(30587,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30554
-bash: kill: (30554) - Operation not permitted
rick@alien:/mnt/c/Windows/System32$ sudo kill 30554
[sudo] password for rick:
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep lock-screen
          |-init(30554,30554)---bash(30555,30554)---lock-screen-tim(30556,30554)---sleep(30587,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30555
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep lock-screen
          |-lock-screen-tim(30556,30554)---sleep(30612,30554)
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep sleep
          |-lock-screen-tim(30556,30554)---sleep(30633,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30556
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep sleep
          `-sleep(30633,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30633
3
задан 28 December 2017 в 04:49

3 ответа

Благодаря этому Q& (, как уничтожить задание крона если это doesn' t показывают в PS? или заставьте это показывать в PS? ), я был установлен на правильном пути:

───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps wwuxa |grep display-auto | grep -v grep
root      1584  0.0  0.0   4508   780 ?        Ss   14:02   0:00 /bin/sh -c    /usr/local/bin/display-auto-brightness
root      1592  0.0  0.0  12564  2984 ?        S    14:02   0:00 /bin/bash /usr/local/bin/display-auto-brightness
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -p -g | grep display-auto
             |-cron(1376,1376)---cron(1436,1376)---sh(1584,1584)---display-auto-br(1592,1584)---sleep(16989,1584)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ 

крон Уничтожения (с 1376 и 1436 pid) является, вероятно, плохой идеей. Однако уничтожая оболочку удара (1584), который является родителем к автоматическая яркость дисплея (1592) и прародитель к , сон (16989) должен уничтожить ребенка и внука. Затем две копии дочернего процесса (автоматическая яркость дисплея) не будут работать одновременно.

Теперь прибывает проблема программирования сценария, но по крайней мере теперь я знаю, как извлечь информацию.

0
ответ дан 1 December 2019 в 16:55

Так как Вы хотите найти только PIDs выполнения процесса и ничто косвенно связанное (т.е. PID эти sudo вызов, и grep поиск имени процесса), Вы можете просто grep незаконные слова от начального поиска.

$ ps aux | grep display-auto-brightness | grep -vw -e grep -e sudo | awk '{print $2}'
1
ответ дан 1 December 2019 в 16:55

Эффективно, да, существует способ идентифицировать их как единственный процесс, но с условием.

Предположим, что у нас есть это:

#!/bin/bash
loop_function(){
    while :
    do
       sleep 3
    done
}

loop_function &

while true
do
    sleep 3
done

И мы запускаем его в фоне:

bash-4.3$ ./simple_example.sh &
[1] 16180

Здесь мы видим, что сам сценарий имеет 16 180 PID. У всех его детей был бы другой. Теперь, у всех них есть общий родитель: оболочка, которая указана в #! строка, т.е. что точно тот же самый PID, о котором сообщили, когда мы выполнили сценарий в фоне. Таким образом, при помощи ps с определением ppid , мы можем искать все процессы, принадлежащие тому же процессу.

bash-4.3$ ps -e  -o ppid,command | grep 16180 | grep -v grep
16180 /bin/bash ./simple_example.sh
16180 sleep 3

Теперь, очевидно, это подразумевает две вещи:

  • для собирания в группу процессов необходимо знать родительский PID
  • детские дочерние процессы будут иметь другой родительский PID, таким образом если у Вас будет больше чем один уровень вызовов функции, то будет трудно проследить все процессы.

Что касается pstree часть вопроса, задание действительно появлялось там - это было просто отключено grep. Вам также не нужно sudo для просмотра cronjobs:

$ ps -ef | grep cron | grep -v grep && echo $USER                                                                        
root       896     1  0 09:47 ?        00:00:00 /usr/sbin/cron -f
xieerqi
1
ответ дан 1 December 2019 в 16:55

Другие вопросы по тегам:

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