Если Вы думаете о как strace
работы затем, это имеет общий смысл, что ни один из builtins к Bash не был бы прослеживаем. strace
может только проследить фактические исполняемые файлы, тогда как builtins не.
Например, мой cd
команда:
$ type cd
cd is a function
cd ()
{
builtin cd "$@";
local result=$?;
__rvm_project_rvmrc;
__rvm_after_cd;
return $result
}
Я столкнулся с этой техникой, где Вы могли вызвать strace
на фактическом bash
процесс и таким образом, косвенно проследите cd
тот путь.
$ stty -echo
$ cat | strace bash > /dev/null
Который приводит ко мне способность к strace bash
процесс следующим образом:
....
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", X_OK) = 0
stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=940312, ...}) = 0
geteuid() = 500
getegid() = 501
getuid() = 500
getgid() = 501
access("/bin/bash", R_OK) = 0
getpgrp() = 32438
rt_sigaction(SIGCHLD, {0x43e360, [], SA_RESTORER, 0x34e7233140}, {SIG_DFL, [], SA_RESTORER, 0x34e7233140}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=1024, rlim_max=62265}) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
fcntl(0, F_GETFL) = 0 (flags O_RDONLY)
fstat(0, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
Это - подсказка Bash, где она находится там, ожидая некоторого входа. Поэтому давайте дадим ему команду cd ..
:
read(0, "c", 1) = 1
read(0, "d", 1) = 1
read(0, " ", 1) = 1
read(0, ".", 1) = 1
read(0, ".", 1) = 1
read(0, "\n", 1) = 1
stat("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/saml", {st_mode=S_IFDIR|0700, st_size=32768, ...}) = 0
stat("/home/saml/tst", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/saml/tst/90609", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
chdir("/home/saml/tst") = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0,
От вышеупомянутого вывода Вы видите, где я ввел команду, cd ..
и хит входит, (\n
). Оттуда Вы видите что stat()
функция была вызвана, и что впоследствии Bash находится в другом read(0..
подсказка, ожидающая другой команды.
Некоторые версии systemd отказываются приостанавливаться, если вы закрываете крышку в течение трех минут после загрузки машины, и, возможно, еще один меньший тайм-аут после возобновления. Эти количества не настраиваются. Может быть, это ваша проблема?
Чтобы узнать об инструментах для отладки, см. Этот пост для увеличения уровня журнала, чтобы logind действительно сообщал вам, почему он не приостанавливается (не очень интуитивно):
http: //lists.freedesktop .org / archives / systemd-devel / 2013-March / 010004.html
На основании комментария @ ajp кажется, что решение, которое вы хотите, при условии, что ваша systemd обновлена, - это добавить HoldoffTimeoutSec = 0 с
до /etc/systemd/logind.conf
. На самом деле, теперь это, похоже, задокументировано на странице руководства для systemd.conf
. Я рад, что я кое-что узнал, отвечая на этот вопрос.