Вбити процес і змусити його повернути 0 в Linux?


16

Як в середовищі Linux я можу надсилати сигнал вбивства до процесу, переконуючись, що вихідний код, що повертається з цього процесу, дорівнює 0? Чи потрібно мені зробити для цього фантастичну магію GDB, або є химерний сигнал вбивства, про який я не знаю?

Тестовий випадок:

cat; echo $?

killall cat

Спроба різних сигналів вбивства пропонує лише різні зворотні сигнали, такі як 129, 137 та 143. Моя мета - вбити процес, який запускає сценарій, але змусити сценарій вважати, що він був успішним.

Відповіді:


20

Ви можете приєднати до процесу за допомогою GDB та ідентифікатора процесу, а потім видати callкоманду exit(0)в якості аргументу.

callдозволяє викликати функції в рамках запущеної програми. Виклик exit(0)виходів із кодом повернення 0.

gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)

Program exited normally.

Як однолінійний інструмент:

gdb --batch --eval-command 'call exit(0)' --pid <process id>

Це не буде працювати , якщо програма не використовує (г) Libc, наприклад, програма , записана в зборі: No symbol table is loaded. Use the "file" command. Хоча це вкрай малоймовірно.
Крістіан Цюпіту,

Працював над рубіновим сценарієм :-D
Михайло

1
@ CristianCiupitu Існує спосіб вирішити цю проблему. Після вступу до наступного системного виклику просто змініть відповідні регістри, щоб викликати цільову програму для виклику _exitсистемного виклику з 0аргументом. Це буде працювати над будь-яким процесом, який не просто циклічний цикл та спалювання процесорних циклів. Якщо процес не застряг у нескінченному циклі, ви все одно можете використовувати той самий підхід, якщо зможете знайти необхідні вказівки десь у його виконуваному файлі та вкажіть там вказівник інструкцій.
kasperd

@Mikhail працював над "рубіновим сценарієм", оскільки GDB був підключений до процесу перекладача рубіну, двійковий код якого був пов'язаний з glibc.
Даніель

@kasperd, так, я хоч і так, але більш точні інструкції були б непогані.
Крістіан Цюпіту

8

Ні. Коли оболонка ловить SIGCHLDїї, безумовно встановлює повернене значення належним чином нульовому значенню, тому це вимагатиме зміни або сценарію, або оболонки.


3

Я не впевнений, але це вийде з 0, якщо буде отримано якийсь із перерахованих сигналів. Ви можете виконувати інші дії, включаючи виклик функції тощо.

#!/bin/bash 
trap 'exit 0' SIGINT SIGQUIT SIGTERM

3

Цей одноразовий працював для мене:

/bin/bash -c '/usr/bin/killall -q process_name; exit 0'

Я не думаю, що ти зрозумів це питання. Ні в якому разі ця команда не зможе досягти того, про що просили. Це те , що я отримав від використання вашої команди: $ cat; echo $? Terminated 143.
kasperd

2
@Landon Thomas, ваш рядок коду, показаний тут, насправді повертає 0. Однак ім’я_процесу, яке було вбито, НЕ повертає 0, а це хотіла ОП.
Даніель

2

Трохи хакітський спосіб, але ..

Ви можете створити обгортку для свого процесу, переосмисливши обробник SIGCHLD. Наприклад:

#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand

Після цього ви можете зробити свій сценарій запуском цієї обгортки замість вашого процесу, поставивши її раніше в $ PATH і перейменувавши на те саме ім’я.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.