Почему команда sleep является независимым процессом, а другие, по-видимому, не используются в сценарии оболочки?

exit, выполняемый удаленной оболочкой, завершит эту оболочку. В случае, когда выполняется true, удаленная оболочка завершит работу из-за отсутствия дальнейших команд для выполнения, но exitзавершит ее, даже если после нее (будут дополнительные команды, как в любом скрипте ).

В простом случае, когда сеанс SSH предназначен только для выполнения набора команд (, где он не устанавливает туннели или не использует совместное использование соединения ), сеанс завершается, когда удаленный оболочка завершается, независимо от того, как удаленная оболочка завершается (либо по exit, либо по какой-то ошибке, либо по получении сигнала HUP, либо просто по достижению конца скрипта ).

Обратите внимание, что в руководстве сказано: «[...] и все соединения X11 и TCP закрыты». Это означает, что соединение может не прерваться только потому, что удаленная оболочка завершила работу. Это будет иметь место, когда вы, например, используете совместное использование соединения с ssh -Mиssh -S(или настройку ControlMasterв ~/.ssh/config; см. man sshи man ssh_config). Я предполагаю, что туннели SSH также будут поддерживать сеанс SSH, пока они не будут явно закрыты.

Чтобы действительно разорвать соединение SSH, вы можете отправить управляющую командуexitс помощью ssh -O exit user@host. Это приведет к завершению всех общих сеансов SSH на user@host.

0
14.01.2021, 15:34
3 ответа

Здесь необходимо рассмотреть два аспекта:

  1. echoи pwdдействительно не могут отображаться как независимые процессы, потому что они являются встроенными командами оболочки bash(см. вывод type echo, например. -но обратите внимание, что они вполне могут быть реализованы как внешние исполняемые файлы, а то, что реализовано или не реализовано как встроенная или внешняя программа, варьируется от оболочки к оболочке ).
  2. Команды, запущенные оболочкой, которые вызывают внешний исполняемый файл (, например.df)с другой стороны являются независимыми процессами, но они часто завершаются так быстро, что вам будет трудно "поймать" их с помощью ps, (, т.е. они уже завершены, когда psзапускается и по этой причине не отображается в выводе ).
4
18.03.2021, 22:37

Короткий ответ :, потому что так устроена система. Люди, разрабатывавшие Unix, давно должны были принять решение, какие команды будут внутренними (, распознаваемыми и выполняемыми самой оболочкой ), а какие внешними (выполняются через отдельные двоичные файлы/процессы. ).

Некоторые команды, такие как cd, pwdили set, очевидно, должны быть внутренними, поскольку они относятся к внутреннему состоянию оболочки, поэтому они не могут выполняться внешними процессами. Что касается большинства других команд, у разработчиков был выбор, должна ли команда быть внутренней или внешней -, и на самом деле между различными оболочками существуют различия в этом отношении.

Например, были некоторые старые системы/оболочки, где echoбыла внешней командой. В настоящее время echoявляется внутренней командой почти во всех оболочках, однако устаревшая внешняя команда /bin/echoвсе еще существует (, по крайней мере, в Linux ), вероятно, из соображений совместимости.

Как сказано в другом ответе, используя команду type(, которая, очевидно, должна быть внутренней командой, такой как cd), вы можете проверить, какие команды являются внутренними, а какие внешними:

raj@rafa:~$ type echo
echo is a shell builtin
raj@rafa:~$ type df
df is hashed (/bin/df)
raj@rafa:~$ type ps
ps is /bin/ps
raj@rafa:~$ 

Обратите внимание на сообщение «df is hashed» -это означает, что команда dfуже использовалась в этом сеансе оболочки, поэтому оболочка запомнила свое местоположение и не должна снова искать ее на диске, когда я хотите запустить его. С другой стороны, psеще не использовался в этом сеансе, поэтому команда просто показывает путь к нему.

0
18.03.2021, 22:37

sleep является внешним процессом, потому что Bash по умолчанию не предоставляет его встроенную версию. Это было бы нетрудно сделать, так как программа в значительной степени выполняет только один системный вызов, но между реализациями есть различия, некоторые не ограничены целочисленными значениями, некоторые принимают спецификаторы, такие как mдля минут и т. д.

dfи psтакже обычно являются внешними процессами. dfвозможно, работает слишком быстро, чтобы вы могли его поймать (в моей системе, time dfпоказывает, что для его запуска требуется 0,003 с ), но вывод psпо необходимости также содержит psсам процесс, который вы можете увидеть, например, ps -ef |grep ps.

С другой стороны, echoи pwdвстроены в Bash, что вы можете узнать, запустив, например,. type echo. Должно быть написано echo is a shell builtin. Ни то, ни другое не должно быть, и они обычно доступны как /bin/echoи /bin/pwd, а также (или, возможно, /usr/bin/, если в вашей системе есть отдельные /binи/usr/bin). pwdможет быть внешним, поскольку текущий рабочий каталог наследуется дочерними процессами. С другой стороны,cdне может , потому что изменения в рабочем каталоге не влияют на родительский процесс.

Вы также можете иметь оболочку, которая реализует sleep, df, ps, cpи тому подобное внутри. Например, Busybox содержит реализации всех из них. Тем не менее, тот, что в моей системе, по-прежнему разветвляет другой процесс для запуска sleep(, но, похоже, не делает этого дляdf).

2
18.03.2021, 22:37

Теги

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