
Если в командной строке bash введены два задания, разделенные точкой с запятой:
$ job 1; job 2;
Как мне отменить второе задание? Если я нажму CTRL+ c, первое будет отменено и запустится «задание 2», я просто хочу остановить второе задание, чтобы оно не выполнялось. Я пробовал atq, ps, но безуспешно, с ps -ef я вижу только «задание 1», но «задание 2» не указано, поэтому я не могу получить PID для использования kill. Я знаю, что могу использовать && вместо ;, но теперь слишком поздно, я случайно запустил эту команду на своем сервере вместо своего домашнего ПК, и теперь я пытаюсь понять, как предотвратить катастрофу.
Эта проблема характерна для команды rsync, за которой следует другая команда:
$ rsync ..... ; sudo shutdown -h now
Уничтожение процесса по идентификатору или уничтожение его родителя не сработает.
После нескольких часов тестирования я изолировал ее от rsync, другие команды я могу завершить с помощью CTRL+ cв разном порядке, но не если они идут после некоторых команд, таких как rsync или ping. Я пробовал разные версии Ubuntu, ядра, сервер без пользователя sudo, и мне удавалось воспроизвести проблему везде. Лучший способ избежать этой проблемы — использовать && после rsync, чтобы выполнить следующую команду только в случае успешного завершения с кодом 0:
$ rsync .... && job 2
решение1
Убейродительский процессиз job1 с SIGKILL
.
Показать процессы в дереве процессов, например, с помощью htop
или ps axf
и завершитьродительский процесс job1а не сама работа1.
Установить htop
с помощью
sudo apt-get install htop
Проголосовавшие против, поймите ответ, прежде чем голосовать против
решение2
Мне кажется, вы что-то упускаете. Когда вы запускаете две команды, разделенные знаком «+», ;
вы можете завершить обе команды, нажав CTRL«+» c.
Просто чтобы убедиться, попробуйте эту команду:
find / -name a ; ls /home
Затем завершите вышеуказанные команды с помощью CTRL+ c, это завершит оба процесса, вы не увидите список своего домашнего контента. То есть, следующая команда не будет запущена.
ОБНОВЛЯТЬ:Это также будет справедливо для вашей rsync
команды. Вот мой пример:
$ rsync -avz /var/cache/apt/archives/ /tmp/backups/ ; sudo shutdown -h now
sending incremental file list
created directory /tmp/backups
./
authbind_1.2.0build3_amd64.deb
................
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [sender=3.0.9]
[sudo] password for user:
Итак, как вы видите выше, когда вы запускаете CTRL+ c, это убивает первую команду, и при запуске шудауна она запросит у вас sudo
пароль, поэтому теперь вы можете убить второй процесс, снова нажав CTRL+ c.
Обновление 2В качестве решения проблемы вы можете сделать следующее:
- так как вы используете passwordless,
sudo
то снова заставьте васsudo
запрашивать пароль, отредактировав файл sudoersudo visudo
- Как последний шаг, если ничего не помогаети просто хак и это не желательноотредактируйте
/sbin/shutdown
команду, чтобы удалить+x
ее или просто переименуйте ее в другое имя.