Linux complete and exit

Linux complete and exit

Команда exit является встроенной командой, предназначенной для завершения процесса командной оболочки с кодом успешного завершения или кодом ошибки, если такой был передан в качестве аргумента. Данная команда крайне полезна в случае использования команды su для временной работы от лица другого пользователя — для возвращения в командную оболочку, открытую от лица текущего пользователя, достаточно просто выполнить ее.

Базовый синтаксис команды выглядит следующим образом:

Команда не принимает никаких параметров, но может принимать числовое значение кода завершения работы процесса командной оболочки. Как обычно, нулевой код обозначает успешное завершение работы процесса, ненулевой — указывает на ошибку. Данная команда нередко используется в сценариях командной оболочки, причем в случае отсутствия кода завершения работы возвращается код завершения работы последней команды.

Примеры использования

Использование вместе с командой su

Для работы от лица другого пользователя (чаще всего таким пользователем является root) достаточно использовать команду su, для возврата в командную оболочку, открытую от лица текущего пользователя — команду exit:

$ whoami
alexfc
$ su
Пароль:
# whoami
root
# exit
exit
$ whoami
alexfc

В данном случае команда su эквивалентна команде su root, то есть, предназначена для открытия командной оболочки от лица пользователя root. Команда whoami выводит имя текущего пользователя командной оболочки и используется для демонстрации смены пользователей.

Использование в сценариях командной оболочки

В рамках сценария командной оболочки команда exit может использоваться для завершения его работы и возврата заданного кода завершения. А это простой пример такого сценария:

#!/bin/bash
if [ «$(id -u)» != «0» ]; then
echo «Вы не имеете привилегий пользователя root»
exit 1
fi
ls /root
exit 0

В данном сценарии команда id -u используется для получения идентификатора текущего пользователя (идентификатор пользователя root при любых обстоятельствах равен 0). В том случае если идентификатор пользователя не равен 0 выводится соответствующее сообщение об ошибке (директива 1>&2 нужна для вывода сообщения с помощью стандартного потока ошибок), а работа сценария завершается с кодом 1. В противном случае выводится список файлов из домашней директории пользователя root (ls /root) и работа сценария завершается с кодом 0.

$ chmod +x testroot.sh
$ ./testroot.sh
Вы не имеете привилегий пользователя root
$ su
Пароль:
# ./testroot.sh
anaconda-ks.cfg

Читайте также:  Линукс создать папку команда

Источник

Русские Блоги

Интерфейс завершения компонентов ядра Linux (механизм синхронизации потоков ядра)

Следующий источник перевода содержимого: «Основные драйверы устройств Linux», глава 3 Интерфейс завершения.

Many parts of the kernel initiate certain activities as separate execution threads and then wait for them to complete. The completion interface is an efficient and easy way to implement such code patterns.

Некоторые модули ядра Linux активируют некоторые независимые исполняемые потоки, а затем ждут завершения их выполнения. Интерфейс завершения — это эффективный способ реализации этого шаблона кода (эквивалент решения).

Some example usage scenarios include the following:

Вот некоторые примеры (три сценария применения):

  • Your driver module is assisted by a kernel thread. If you rmmod the module, the release() method is invoked before removing the module code from kernel space. The release routine asks the thread to kill itself and blocks until the thread completes its exit. Listing 3.7 implements this case.

Написанный нами модуль драйвера загружается в ядро ​​потоком ядра (insmod). Если мы выполним rmmod для удаления этого модуля, функция release () модуля будет вызвана и выполнена до того, как модуль будет удален из пространства ядра. Release () в следующем примере разбудит поток B, затем заблокирует текущий поток A и уничтожит себя после того, как поток B завершит выполнение.

  • You are writing a portion of a block device driver (discussed in Chapter 14, «Block Drivers») that queues a read request to a device. This triggers a state machine change implemented as a separate thread or work queue. The driver wants to wait until the operation completes before proceeding with another activity. Look at drivers/block/floppy.c for an example.

Если мы пишем драйвер блочного устройства, нам нужно встать в очередь, чтобы прочитать устройство. Это приводит к тому, что конечный автомат становится независимым потоком или рабочей очередью, ожидая завершения операции перед выполнением следующей операции. drivers / block / floppy.c является примером.

  • An application requests an Analog-to-Digital Converter (ADC) driver for a data sample. The driver initiates a conversion request waits, until an interrupt signals completion of conversion, and returns the data.

Прикладная программа запрашивает функцию выборки у драйвера АЦП.Этот драйвер инициализирует запрос преобразования и ждет, пока преобразование не будет завершено, генерирует сигнал прерывания и возвращает данные выборки.

static DECLARE_COMPLETION(my_thread_exit); /* Completion */ static DECLARE_WAIT_QUEUE_HEAD(my_thread_wait); /* Wait Queue */ int pink_slip = 0; /* Exit Flag */ /* Helper thread */ static int my_thread(void *unused) < DECLARE_WAITQUEUE(wait, current); daemonize("my_thread"); add_wait_queue(&my_thread_wait, &wait); while (1) < /* Relinquish processor until event occurs */ set_current_state(TASK_INTERRUPTIBLE); schedule(); /* Control gets here when the thread is woken up from the my_thread_wait wait queue */ /* Quit if let go */ if (pink_slip) < break; >/* Do the real work */ /* . */ > /* Bail out of the wait queue */ __set_current_state(TASK_RUNNING); remove_wait_queue(&my_thread_wait, &wait); /* Atomically signal completion and exit */ complete_and_exit(&my_thread_exit, 0); > /* Module Initialization */ static int __init my_init(void) < /* . */ /* Kick start the thread */ kernel_thread(my_thread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD); /* . */ >/* Module Release */ static void __exit my_release(void) < /* . */ pink_slip = 1; /* my_thread must go */ wake_up(&my_thread_wait); /* Activate my_thread */ wait_for_completion(&my_thread_exit); /* Wait until my_thread quits */ /* . */ >

A completion object can be declared statically using DECLARE_COMPLETION() or created dynamically with init_completion() . A thread can signal completion with the help of complete() or complete_all(). A caller can wait for completion via wait_for_completion().

Читайте также:  Davinci resolve linux install

Объект завершения может быть объявлен статически с помощью DECLARE_COMPLETION () или динамически объявлен с помощью init_completion ().

Поток может использовать complete () или complete_all () для обозначения завершения. Вызывающий (другой поток) может использовать wait_for_completion () для ожидания завершения. (Это можно понимать как операцию синхронизации двух потоков.)

In Listing 3.7, my_release() raises an exit request flag by setting pink_slip before waking up my_thread(). It then calls wait_for_completion() to wait until my_thread() completes its exit. my_thread(), on its part, wakes up to find pink_slip set, and does the following:

В приведенном выше примере функция my_release () вызывается при выходе из модуля, а затем для pink_slip устанавливается значение 1, чтобы разбудить поток my_thread (). Затем вызовите wait_for_completion (), чтобы заблокировать текущий поток. Вызвать complete_and_exit (& my_thread_exit, 0); пока поток my_thread () не закончит выполнение

my_thread() accomplishes these two steps atomically using complete_and_exit(). Using complete_and_exit() shuts the window between module exit and thread exit that opens if you separately invoke complete() and exit().

We will use the completion API when we develop an example telemetry driver in Chapter 11.

Поток my_thread () использует complete_and_exit (). Он завершился атомарно и гарантированно не будет прерван. В главе 11 мы будем использовать примеры интерфейса API завершения.

Дополнительный фрагмент кода (из LDD3):

#include #include #include #include #include #include #include MODULE_LICENSE("GPL"); static int complete_major=250; DECLARE_COMPLETION(comp); ssize_t complete_read(struct file *filp,char __user *buf,size_t count,loff_t *pos) < printk(KERN_ERR "process %i (%s) going to sleep\n",current->pid,current->comm); wait_for_completion(&comp); printk(KERN_ERR "awoken %i (%s)\n",current->pid,current->comm); return 0; > ssize_t complete_write(struct file *filp,const char __user *buf,size_t count,loff_t *pos) < printk(KERN_ERR "process %i (%s) awakening the readers. \n",current->pid,current->comm); complete(&comp); return count; > struct file_operations complete_fops=< .owner=THIS_MODULE, .read=complete_read, .write=complete_write, >; int complete_init(void) < int result; result=register_chrdev(complete_major,"complete",&complete_fops); if(result<0) return result; if(complete_major==0) complete_major=result; return 0; >void complete_cleanup(void) < unregister_chrdev(complete_major,"complete"); >module_init(complete_init); module_exit(complete_cleanup); 

Источник

Proper way to exit command line program?

I’m using mac/linux and I know that ctrl-z stops the currently running command in terminal, but I frequently see the process is still running when i check the system monitor. What is the right way to stop a command in terminal? Typically I run into this issue when running python or ruby apps, i’m not sure if that has something to do with it, just thought I would add that.

also, i have to force quit the process from activity monitor as opposed to just quitting it to get it to stop, that could mostly be a fault of the type of program i was running, but i felt it was worth mentioning

3 Answers 3

Using control-z suspends the process (see the output from stty -a which lists the key stroke under susp ). That leaves it running, but in suspended animation (so it is not using any CPU resources). It can be resumed later.

If you want to stop a program permanently, then any of interrupt (often control-c ) or quit (often control-\ ) will stop the process, the latter producing a core dump (unless you’ve disabled them). You might also use a HUP or TERM signal (or, if really necessary, the KILL signal, but try the other signals first) sent to the process from another terminal; or you could use control-z to suspend the process and then send the death threat from the current terminal, and then bring the (about to die) process back into the foreground ( fg ).

Note that all key combinations are subject to change via the stty command or equivalents; the defaults may vary from system to system.

Источник

Оцените статью
Adblock
detector