В пустом каталоге:
% stat .
File: `.'
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fe04h/65028d Inode: 537317737 Links: 2
Access: (0750/drwxr-x---) Uid: ( 1000/stribika) Gid: ( 100/ users)
Access: 2011-02-22 08:47:20.935036074 +0100
Modify: 2011-02-22 08:47:20.935036074 +0100
Change: 2011-02-22 08:47:20.935036074 +0100
Birth: -
% mkdir foo
% stat .
File: `.'
Size: 16 Blocks: 0 IO Block: 4096 directory
Device: fe04h/65028d Inode: 537317737 Links: 3
Access: (0750/drwxr-x---) Uid: ( 1000/stribika) Gid: ( 100/ users)
Access: 2011-02-22 08:47:20.935036074 +0100
Modify: 2011-02-22 08:47:57.465036072 +0100
Change: 2011-02-22 08:47:57.465036072 +0100
Birth: -
% stat foo
File: `foo'
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fe04h/65028d Inode: 509269 Links: 2
Access: (0750/drwxr-x---) Uid: ( 1000/stribika) Gid: ( 100/ users)
Access: 2011-02-22 08:47:57.465036072 +0100
Modify: 2011-02-22 08:47:57.465036072 +0100
Change: 2011-02-22 08:47:57.465036072 +0100
Birth: -
Поскольку Вы видите, что существует 2 ссылки на пустой каталог. Когда я создаю новый в нем, число каналов увеличивается до 3. Additionaly там являются 2 ссылками на новый каталог. Общее количество является 3 новыми ссылками.
Это вызвано тем, что каждый каталог имеет ссылку на себя (.) и ее родителя (..).
Программа sl
намеренно игнорирует SIGINT
, который является тем, что отправляется, когда Вы нажимаете Ctrl+C. Так, во-первых, необходимо будет сказать sl
не проигнорировать SIGINT
путем добавления -e
аргумент.
При попытке этого Вы заметите, что можно остановить каждого человека sl
, но они все еще повторяются. Необходимо сказать bash
выходить после SIGINT
также. Можно сделать это путем помещения a trap "exit" INT
перед циклом.
#!/bin/bash
trap "exit" INT
while :
do
sl -e
done
Ctrl-Z
приостановить сценарийkill %%
%%
говорит встроенный удар kill
то, что Вы хотите отправить сигнал (SIGTERM по умолчанию) к последний раз приостановленному фоновому заданию в текущей оболочке, не к идентификатору процесса.
Можно также указать задания числом или по имени. например, когда Вы приостанавливаете задание с ^Z, удар скажет Вам, как что его число задания с чем-то [n]+ Stopped
, где n
в квадратных скобках число задания.
Для большего количества информации об управлении заданиями и об уничтожении заданий, выполненных help jobs
, help fg
, help bg
, и help kill
в ударе и поиске JOB CONTROL
(все заглавные буквы) или jobspec
в странице справочника удара.
например.
$ ./killme.sh ./killme.sh: line 4: sl: command not found ./killme.sh: line 4: sl: command not found ./killme.sh: line 4: sl: command not found ./killme.sh: line 4: sl: command not found ./killme.sh: line 4: sl: command not found ... ... ... ./killme.sh: line 4: sl: command not found ^Z [1]+ Stopped ./killme.sh $ kill %% $ [1]+ Terminated ./killme.sh
В этом примере число задания равнялось 1, таким образом, kill %1
работал бы то же как kill %%
(ПРИМЕЧАНИЕ: Я не имею sl
установленный, таким образом, вывод является просто "командой, не найденной". в Вашем случае Вы доберетесь, любой вывод sl производит. это не важно - ^Z
приостановите и kill %%
будет работать то же),
sl
) быть выполненным в цикле, но сценарий будет продолжать бежать... и запускать другого sl
. При нажатии ^C несколько раз действительно быстро можно добраться для уничтожения обоих sl
и сценарий (если ни один из них не захватывает SIGINT). ^Z приостановит сценарий почти сразу (сразу, если Вы не будете считать буферизованный вывод, который все еще печатается к Вашему терминалу), таким образом, можно уничтожить его с kill %%
– cas
18.09.2012, 05:48
sl
забавная программа". На этот раз, это забава я снова! _
– Yinyanghu
18.09.2012, 06:07
The symbols %% and %+ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background. The previous job may be referenced using %-. If there is only a single job, %+ and %- can both be used to refer to that job
– cas
18.02.2018, 08:23
Можно завершить тот сценарий путем нажатия Ctrl+C от терминала, где Вы запустили этот сценарий. Конечно, этот сценарий должен работать на переднем плане, таким образом, Вы можете остановить его Ctrl+C.
Или можно найти PID (идентификатор Процесса) того сценария в другом открытом терминале:
ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>
Оба пути должны добиться цели Ваш, просят.
while [ true ]
do
#check if script is running
ps | grep script_name.sh | grep -v grep >/dev/null 2>&1
if [ "$!" != "0" ] ; then
break
else
kill -9 ` ps -ef | grep script_name.sh | cut -d "a" -f 1`
echo "kill -9 `get script PID`"
fi
done
это должно помочь.
Вы можете убить
идентификатор pid
оболочки (bash).
Я просто попробовал, и все работает.
Потому что я не вижу процесс из ps -ef
(задание, которое мы запускаем в сценарии цикла).
Использование SET
для выхода из отказа.
#!/bin/bash
set -e
while :
do
sl
done
Убийство - это ужасно, потому что вы никогда не узнаете, должен ли скрипт выполняться дважды. И код выхода неправильный.
while [ something ]; do
if [ somethingelse ]; then
echo shut down script with exit code 0
exit 0
fi
done
echo something else not happend
exit 2 # Return val important for example for monitoring
Не работает. Решение = использовать perl. while opens own bash
Как отметил @ Shadur, эта проблема может быть связана с вашим интернет-провайдером (или сетью, в которой установлен сервер). При наличии ограничений безопасности для порта SMTP (номер порта 25) серверы MX не могут получить доступ через этот порт.
Вместо этого можно использовать SMTP через порт SSL (ssmtp, номер порта 465). Для этого отредактируйте файл /etc/postfix/master.cf
, прокомментируйте smtp-строку и добавьте вместо нее ssmtp-строку:
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
#smtp inet n - - - - smtpd
ssmtp inet n - - - - smtpd
Чтобы проверить, распознана ли эта запись с таким именем на вашем компьютере, можно выполнить следующие действия:
$>cat /etc/services | grep smtp
smtp 25/tcp mail
ssmtp 465/tcp smtps # SMTP over SSL
-121--42043- Если оболочка входа даже не запускается, вход в систему невозможен. Клиент отправляет последовательность на сервер, и для интерпретации последовательности требуется оболочка входа пользователя на сервере. Клиент не имеет пути указывать серверу «выполнить другую команду».
Это механизм безопасности: если оболочка пользователя ограничена тем, что он может сделать, то пользователь не может сделать ничего, что не позволяет.
Если вы заблокировали доступ ко всем учетным записям в системе, то вам придется использовать метод, который обходит обычные имена входа, например физический доступ или консоль восстановления.
Некоторые советы:
/etc/shells
. bash-static
или sash
или набор учетную запись toor (альтернативный способ входа корня в систему). Имейте в виду, что sudo
тоже может сломаться; возможно, вы захотите иметь экстренный пароль на аккаунте, который случайно создан (уникальный и не заучен) и записан на бумажке, которую вы храните в сейфе. Самым простым способом является выдача сигнала QUIT
, который обычно подключается к Control-Backslash
.
Когда вы увидите поезд, нажмите Control -\
Если вы хотите, чтобы ctrl + c остановил цикл, но не завершил скрипт, вы можете поместить || break
после любой выполняемой команды. Пока программа, которую вы запускаете, завершается нажатием ctrl + c, это отлично работает.
#!/bin/bash
while :
do
# ctrl+c terminates sl, but not the shell script
sl -e || break
done
Если вы находитесь во вложенном цикле, вы можете использовать «break 2», чтобы выйти из двух уровней и т. Д.
Другой способ завершить весь сценарий - запустить команду sl
в фоновом режиме, а затем перехватить сигнал INT
для убить всю группу процессов сценария с помощью сигнала HUP
.
#!/bin/bash
trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT
while :
do
sl & wait
done