
如果在 bash 命令列中輸入兩個作業並用分號分隔:
$ job 1; job 2;
怎麼取消第二個呢?如果我按CTRL+ c,第一個作業將被取消,「作業 2」將開始,我只想停止第二個作業而不執行。我嘗試了 atq、ps 但沒有運氣,使用 ps -ef 我只能看到“作業 1”,但未列出“作業 2”,因此我無法獲取 PID 來使用kill。我知道我可以用 && 來代替 ;但現在已經太晚了,我不小心在我的伺服器而不是我的家用電腦上運行了這個命令,現在我正在嘗試找出如何防止災難。
此問題特定於 rsync 指令後面接著另一個指令:
$ rsync ..... ; sudo shutdown -h now
透過 ID 殺死進程或殺死其父進程將不起作用。
經過幾個小時的測試,我將其隔離到 rsync,其他命令我可以以各種順序用CTRL+終止c,但如果它們在rsync 或ping 等命令之後則不能,我嘗試了不同的Ubuntu 版本、內核、沒有sudo 用戶的伺服器我可以在任何地方重現它,避免此問題的最佳方法是在 rsync 之後使用 && 僅在成功退出代碼 0 時執行以下命令:
$ rsync .... && job 2
答案1
殺死父親行程job1 的 與SIGKILL
.
在進程樹中顯示進程,例如。與htop
或ps axf
併殺死job1的父行程而不是 job1 本身。
安裝htop
與
sudo apt-get install htop
投反對票的人,在投反對票前先了解答案
答案2
我認為你錯過了一些東西,當你運行兩個由 + 分隔的命令時,你可以通過+;
殺死這兩個命令。CTRLc
只是為了確定嘗試這個指令:
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
殺死第二個進程。CTRLc
更新2作為解決問題的方法,你可以這樣做:
- 由於您使用無密碼,因此透過編輯 sudoer 檔案
sudo
再次要求輸入密碼sudo
sudo visudo
- 如果沒有其他辦法的話,作為最後一步只是一個駭客,這是不可取的編輯
/sbin/shutdown
命令以刪除+x
或將其重新命名為不同的名稱。