Как может выполнятьcя программа shutdown -h now, если shutdown это ссылка на бинарный файл, (который таких параметров не принимает?)

Knoppix

Модераторы: Warderer, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 833
ОС: астралинукс

Как может выполнятьcя программа shutdown -h now, если shutdown это ссылка на бинарный файл,

Сообщение жучара »

Друзья!
$ sudo shutdown -h now так можно выключить комп. Но что такое shutdown? Это символическая ссылка на /bin/systemctl

Shell

$ whereis shutdown
shutdown: /usr/sbin/shutdown /usr/share/man/man8/shutdown.8.gz /usr/share/man/man2/shutdown.2.gz
$ ls -l /usr/sbin/shutdown
lrwxrwxrwx 1 root root 14 мар 21 00:55 /usr/sbin/shutdown -> /bin/systemctl
$
Я далёк от всего этого, но /bin/systemctl должен запускаться с такими же параметрами (-h now).

Shell

$ sudo /bin/systemctl -h now
systemctl [OPTIONS...] COMMAND ...

Query or send control commands to the system manager.

Unit Commands:
...
$
Ну тут долгая свадьба идёт из перечня параметров. А -h означает help. Так как же я тогда умудряюсь выключаться sudo shutdown -h now? Спасибо. кто откликнется. Debian 11.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 468
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: Как может выполнятьcя программа shutdown -h now, если shutdown это ссылка на бинарный файл,

Сообщение Red Gremlin »

Обычная практика, когда один бинарник заменяет несколько исторически существовавших команд — на него делаются симлинки, а он при запуске проверяет, под каким именем вызывается, и соответственно меняет поведение.

Код: Выделить всё

        if (invoked_as(argv, "halt")) {
                arg_action = ACTION_HALT;
                return halt_parse_argv(argc, argv);

        } else if (invoked_as(argv, "poweroff")) {
                arg_action = ACTION_POWEROFF;
                return halt_parse_argv(argc, argv);

        } else if (invoked_as(argv, "reboot")) {
                if (kexec_loaded())
                        arg_action = ACTION_KEXEC;
                else
                        arg_action = ACTION_REBOOT;
                return halt_parse_argv(argc, argv);

        } else if (invoked_as(argv, "shutdown")) {
                arg_action = ACTION_POWEROFF;
                return shutdown_parse_argv(argc, argv);
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 726
ОС: debian, fedora (i3-wm)

Re: Как может выполнятьcя программа shutdown -h now, если shutdown это ссылка на бинарный файл,

Сообщение olecya »

Проведите эксперимент. Создайте исполняемый файл например tost.sh с содержанием:

Код: Выделить всё

#!/bin/bash
echo $0
Теперь запустите его:

Shell

./tost.sh
./tost.sh
Теперь создайте ссылку:

Shell

ln -s tost.sh shut
И запустите ссылку:

Shell

./shut
./shut
Вот от куда программа systemctl знает какая ссылка при этом была инициатором и не путается какой target unit вызывать.
Добавлено (08:19):
Red Gremlin
Почему-то опять не сработала отмена публикации, если появляются ответы в процессе редактирования.
Спасибо сказали: