質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

Q&A

解決済

2回答

1162閲覧

一定時間が経過したプロセスを削除するシェルスクリプト

mobile105

総合スコア20

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

さくらのレンタルサーバ

さくらのレンタルサーバとは、格安サーバーで知られるさくらインターネット社の提供する共有レンタルサーバー。Webサイトの構築から簡単なプログラミングまで幅広く利用することができ、プランが多いことも特徴です。

0グッド

0クリップ

投稿2020/06/14 21:26

さくらサーバーを利用しています。

下記の記事を参考に一定時間が経過したプロセスを削除するシェルスクリプトを作成しました。
https://ex1.m-yabe.com/archives/3490

#/bin/bash PID=$$ for i in `ps aux -ef | grep "ssh -f -N -L" | grep -v $PID | grep -v grep | awk '{print $2}'` do TIME=`ps -o lstart -p $i` if [ -n "$TIME" ]; then StartupTime=`date +%s -d "$TIME"` CurrentTime=`date +%s` ElapsedTime=`expr $CurrentTime - $StartupTime` else ElapsedTime=1 fi if [ $ElapsedTime -gt 600 ] ; then kill $i fi done

ターミナルからシェルスクリプトを実行すると下記のようなエラーが表示されます。

date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] expr: syntax error [: -gt: unexpected operator date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] expr: syntax error [: -gt: unexpected operator date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] expr: syntax error [: -gt: unexpected operator date: illegal time format usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] expr: syntax error [: -gt: unexpected operator

試したこと

#/bin/bash PID=$$ for i in `ps aux -ef | grep "ssh -f -N -L" | grep -v $PID | grep -v grep | awk '{print $2}'` do TIME=`ps -o lstart -p $i`  echo $TIME done

上記のコードでは正常に動いて下記ように始まった時間が得られます。

STARTED Mon Jun 15 05:58:15 2020 STARTED Mon Jun 15 06:02:37 2020 STARTED Mon Jun 15 06:02:38 2020 STARTED Mon Jun 15 06:16:49 2020

下記の記述の部分が怪しいと思うのですがどう直していいのか分からずお手上げです。

StartupTime=`date +%s -d "$TIME"`

分かる方ご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Linuxじゃないので、dateのオプションが違います。
あと、psのヘッダ行も処理しようとしてしまいます。

Bash

1PID=$$ 2for i in `ps ax | sed 1d | grep -w -v $PID | grep -v grep | awk '{print $1}'` 3do 4 TIME=`ps -o lstart="" -p $i` 5 if [ -n "$TIME" ]; then 6 StartupTime=`date -j -f "%a %b %d %H:%M:%S %Y" "$TIME" +%s` 7 CurrentTime=`date +%s` 8 ElapsedTime=`expr $CurrentTime - $StartupTime` 9 else 10 ElapsedTime=1 11 fi 12 13 if [ $ElapsedTime -gt 600 ] ; then 14 echo kill $i "================================" 15 fi 16done

投稿2020/06/15 01:04

編集2020/06/15 02:16
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mobile105

2020/06/15 01:53

``` #!/bin/bash for i in `ps ax | grep "ssh -f -N -L" | grep -v $$ | grep -v grep | awk '{print $1}'` do TIME=`ps -o lstart="" -p $i` if [ -n "$TIME" ]; then StartupTime=`date -j -f "%a %b %d %H:%M:%S %Y" "$TIME" +%s` CurrentTime=`date +%s` ElapsedTime=`expr $CurrentTime - $StartupTime` else ElapsedTime=1 fi if [ $ElapsedTime -gt 60 ] ; then echo kill $i "================================" kill $i fi done ``` ありがとうございます! なるほどdateオプションが違うのですね。。 一応こちらの記述で目的は達成できたのですがpsの部分は何か記述に問題があるのでしょうか??
otn

2020/06/15 02:18 編集

> psの部分は何か記述に問題があるのでしょうか?? はい。回答に書いたとおりです。別の方が詳しく説明してくれてますね。 ps ax は sed 1d が必要。 ps -o lstart -p $i は、ps -o lstart="" -p $i に変更。
mobile105

2020/06/15 03:09

詳しいご回答ありがとうございます! おかげさまで知識の幅が広がりました。
otn

2020/06/15 10:53

Linuxのpsだと「ヘッダを出さない」というオプションがあるのですが、BSDのpsには無いようです(多分)。
guest

0

※ご提示のコードですが、、1行目のシバン(Shebang)に!が抜けてます。(正:#!/bin/bash 誤: #/bin/bash) 。。。と思ったら参考にされている元記事でも抜けていますね。純粋にコメントのつもりだったのかどうか分かりませんが、シェルはbashと仮定して回答します。また、参照されている元記事では「ps -o lstart --noheader -p $i」としてあり、"STARTED"のヘッダー行を除去しています。対して質問者さんのものではそうなっていませんが、意図的なものでしょうか。このせいでdateコマンドへ与えるオプションとして不正なものとなり、エラーになっています。以下は、あえて--noheaderオプションを使わない場合の回答です。(と言いますか、書いたあとに元記事との差に気が付きました)

dateコマンドでのエラーに関するもののみの指摘ですが、ps -o lstart -p $iのコマンド実行で以下のように出力されるなら

bash

1$ i=1 2$ ps -o lstart -p $i 3 STARTED 4Mon Jun 15 08:14:41 2020

1行目の...STARTEDを例えばsedコマンドで削除するようにしてTIMEシェル変数に入れれば動くはずです。

bash

1$ TIME=`ps -o lstart -p $i | sed 1d` 2$ echo $TIME 3Mon Jun 15 08:14:41 2020 4$ StartupTime=`date +%s -d "$TIME"` 5$ echo $StartupTime 61592176481

一応念のため、シェルスクリプトにして実行した例です。

bash

1$ cat t2.sh 2#!/bin/bash 3 4i=1 5 6TIME=`ps -o lstart -p $i | sed 1d` 7StartupTime=`date +%s -d "$TIME"` 8echo $StartupTime 9 10$ ./t2.sh 111592176481 12$

投稿2020/06/14 23:59

dodox86

総合スコア9256

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mobile105

2020/06/15 01:32

ありがとうございます! 1行目の!マークの抜けは気づきませんでした。。。 --noheaderをつけると動かなかったので--noheaderは外したのですが余分な文字列が挿入されてしまうから動かないんですね。。
dodox86

2020/06/15 01:41

当方はWindows10 WSL/Ubuntu bash での確認でしたので、全体を通しては質問者さんの実行環境とは違うかもしれません。過去のご質問から、CentOSかなと思いましたが。 $ ps -o lstart -p 1 と実行すると STARTED Mon Jun 15 08:14:41 2020 と出力されますが、これをシェル変数に入れるご提示のコード「$ TIME=`ps -o lstart -p 1`」では $ TIME=`ps -o lstart -p 1` $ echo $TIME STARTED Mon Jun 15 08:14:41 2020 となり、質問者さんの状況と同じになることを考慮しての私の回答でした。
mobile105

2020/06/15 01:55

ありがとうございます! さくらサーバーのOSはFreeBSDみたいなのでそこの記述が抜けておりました。 ご協力のおかげでコードは動作するようになりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問