Определение затруднено, так как многие процессы используют одно и то же значение.
% ssh 2>/dev/null localhost 'exit 255' ; echo $?
255
% ssh 2>/dev/null nopelocalhost 'exit 0' ; echo $?
255
С помощью эвристики вы можете угадать, какой код принадлежит какой программе, основываясь на обычно используемых кодах выхода; это было бы в основном правильно, если только задействованные программы не перекрываются или не происходит что-то неожиданное. Стандартная ошибка может быть доступна или недоступна, а код выхода может меняться в зависимости от того, как программа завершает работу :
.% ssh localhost./segfault ; echo $?
255
%./segfault ; echo $?
zsh: bus error ./segfault
138
%
Таким образом, не так надежно гадать, откуда взялся $?
. Вместо этого лучшим вариантом может быть разработка протокола, который передает больше информации, чем предоставляется словом состояния выхода; примеры могут включать Nagios или Ansible, которые сообщают больше, чем просто $?
при определении того, как выполняется удаленная команда. Это может быть простая строка текста, которая зависит от того, как smartctl
выполнялась (или segfault, или... )или что-то более сложное, например, структура JSON со стандартным словом состояния out, err, exit, и другие подобные метаданные. Таким образом, вместо того, чтобы запускать smartctl
напрямую, вы должны вызвать программу-оболочку, которая запускает smartctl
и анализирует его вывод, а на другой стороне ssh
вы будете собирать этот вывод; если вывод недоступен, значит, что-то пошло не так с ssh
или с вашей программой-оболочкой.
Из справочных страниц:
EXIT STATUS
ssh exits with the exit status of the remote command or with 255 if an error occurred.
Если с командой ssh произошла ошибка, она вернет 255, в противном случае она вернет статус выхода удаленной команды.
Пример:
$ ssh root@not.exists
ssh: Could not resolve hostname not.exists: Name or service not known
$ echo $?
255
В вашем случае 1 — это статус выхода команды smartctl
, а неssh
РЕДАКТИРОВАТЬ:
статусы выхода smartctl:
EXIT STATUS
The exit statuses of smartctl are defined by a bitmask. If all is well with the disk, the exit status (return value) of smartctl is 0 (all bits turned off). If a problem occurs, or an error,
potential error, or fault is detected, then a non-zero status is returned. In this case, the eight different bits in the exit status have the following meanings for ATA disks; some of these values
may also be returned for SCSI disks.
Bit 0: Command line did not parse.
Bit 1: Device open failed, device did not return an IDENTIFY DEVICE structure, or device is in a low-power mode (see '-n' option above).
Bit 2: Some SMART or other ATA command to the disk failed, or there was a checksum error in a SMART data structure (see '-b' option above).
Bit 3: SMART status check returned "DISK FAILING".
Bit 4: We found prefail Attributes <= threshold.
Bit 5: SMART status check returned "DISK OK" but we found that some (usage or prefail) Attributes have been <= threshold at some time in the past.
Bit 6: The device error log contains records of errors.
Bit 7: The device self-test log contains records of errors. [ATA only] Failed self-tests outdated by a newer successful extended self-test are ignored.
Статус выхода 1 на smartctl будет означать, что бит 0 включен, поскольку 1=2^0, поэтому командная строка не обрабатывается