お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2011-10-26 09:31:43

reizone
新しいメンバ
登録日: 2011-10-26

ログイン時に実行したプロセスを後から手動で終了させる方法

御質問させて頂きます。

当方環境は以下の通りです。
【マシン】Fit-PC2i
【OS】ubuntu10.04 LTS

/etc/profile.d/以下にkeisoku.shというファイルを作成し、
通常は端末上から実行するプログラムをログイン時に自動的に起動するようにしています。
*******<ファイルの内容>************************
#!/bin/sh
sleep 30 #プログラムの実行まで30秒待つ
cd /home/user1/デスクトップ/keisoku/ #プログラムを置いているフォルダ※1
sudo ./keisoku & #プログラムをバックグラウンドで実行※2
******************************************
sudo時にはパスワードを要求されるため、予め端末でsudo visudoを実行し、
その最下行にuser1 ALL=NOPASSWD:ALLを追記しています。
※1."user1"…使用しているユーザ名です。
※2."keisoku"…プログラムの名前です。

これでkeisokuというプログラムはログイン時に実行されるのですが、
諸事情により使用中に一旦終了させたいことがあります。
しかし、端末上で実行したプログラムではないため、
jobs -l 等のプロセスチェックでは何も出てきません。

何とか終了させる方法は無いでしょうか。

恐れ入りますがどうか宜しくお願い致します。

オフライン

 

#2 2011-10-26 14:06:12

ry
メンバ
登録日: 2008-07-30

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

ps -u user1 でプロセス一覧から PID 調べて、その PID を使って kill PID でどうでしょう

オフライン

 

#3 2011-10-27 13:24:56

reizone
新しいメンバ
登録日: 2011-10-26

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

ry様

ご回答下さいましてありがとう御座います。

ps -u user1 ではプロセスを発見できませんでしたが、
ps -C keisoku と入力し、プロセス名を直接指定することでPIDを割り出せましたので、
sudo kill 当該PID にて無事プロセスを停止させることが出来ました。

大変助かりました。本当にありがとう御座いました。

オフライン

 

#4 2011-10-27 16:47:57

ry
メンバ
登録日: 2008-07-30

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

あぁ、ごめんなさい
「/etc/profile.d/以下にkeisoku.shというファイルを作成し」の一文を読み落としていたようです
この方法だと起動ユーザーは user1 にはなりません
確認していませんが、root か無名ユーザーのどちらかになりそうな気がします
このため、#2 で提案した ps コマンドの -u オプションでは見つからなくて当然でした

#3 のように -C オプションを使ってプロセス名を指定するのが最善でしょう

#3 のように ps -C keisoku と実行して、表示されるプロセスが常に一つだけだという自信ががあるなら、sudo kill `ps -C keisoku -o pid=` と一発でプロセスを停止させることも可能です

オフライン

 

#5 2011-10-27 19:53:59

STGSAGWAN
ゲスト

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

全部killしてよいのなら、

コード:

sudo killall keisoku

とか?

 

#6 2011-10-27 20:56:43

reizone
新しいメンバ
登録日: 2011-10-26

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

ry様

ご教示ありがとうございます。

先ほど sudo kill PID で無事停止できたと申し上げましたが…実はゾンビ化している事を分かっておりませんでした。
keisokuは親-子の2つプロセスが起動するため、ps -C keisoku で表示されるプロセスは2つあります。
子プロセスは問題なく消えますが、親プロセスの方は sudo kill -9 PID で消そうとしても、
その後 ps -C keisoku で確認すると、お尻に <defunct> が付いたまま残ってしまいました。

また、ps -ef | grep -i defunct を試した時にroot権限で実行されている事も分かりました。

ゾンビプロセスが残ったままでそれと同じプロセスを再実行するのはあまり気持ちの良いものではなく、
何とか避けられないかと思案しております。

ちなみに、user1の権限で行った場合は、以下のようになりました。
自動実行をやめさせるため、/profile.d/keisoku.sh の中身を全て"#"でコメントアウトしてPCを再起動した後、
端末から手動で ./keisoku と実行してから、親・子プロセスの停止を試みたところ、
親の方も sudo kill -9 PID を使えば何とか消せました。

以上から、自動実行がrootではなくuser1によって為されれば、後から手動でプロセスを消せるのでは…と思い、
現在その方法を調べております。

オフライン

 

#7 2011-10-27 21:09:06

reizone
新しいメンバ
登録日: 2011-10-26

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

STGSAGWAN 様

ご回答ありがとう御座います。

sudo killall keisoku を試してみました。
ps -C keisoku で確認したところ、子プロセスは無事消えましたが、親プロセスは<defunct>が付いてゾンビ化しておりました。
ゾンビ化したプロセスが残った状態で、その後に同一プロセスを再実行する場合、ゾンビが何も悪さをしなければ問題は無いので、
その点についても確認してみます。

オフライン

 

#8 2011-10-30 21:58:04

reizone
新しいメンバ
登録日: 2011-10-26

Re: ログイン時に実行したプロセスを後から手動で終了させる方法

おかげさまで解決できました。

正常に終了できるようにするために以下の方法を採用しました。
/etc/以下にkeisoku.shを作成し(内容は最初の投稿の時と同じ)、sudo chmod a+x keisoku.sh で実行権限を与えます。
デスクトップから、自動起動するアプリの追加を行い、コマンドにはsudo /etc/keisoku.shと記述。
こうすることで、プログラム"keisoku"はログイン後30秒経過してから自動で起動するようになりました。
一般ユーザにより実行されているためちゃんと停止でき、defunct状態(ゾンビ)にはなりません。

オフライン

 

Board footer

Powered by FluxBB