cronjob 文本输出中断
cronjob text output cut off
我有一个 cronjob,每 2 小时 运行 一个 python 脚本。脚本本身可以 运行 超过 2 小时。这就是我尝试检测脚本是否已经 运行ning 的原因。系统是FreeBSD机器。我尝试使用以下函数进行检测:
def script_already_running(script_name,console_logger,parameter=None):
"""
checks if the script is already running, this is done by syscall and parsing the output. Parameters of the script can be distinguished as well
"""
ps = subprocess.Popen("ps aux", shell=True, stdout=subprocess.PIPE)
process_strings = ps.stdout.read().decode(encoding="utf-8",errors="strict")
ps.stdout.close()
ps.wait()
console_logger.info(process_strings)
# print(process_strings)
# print(script_name)
if script_name in process_strings and parameter is None:
script_running = True
elif script_name in process_strings and parameter is not None:
if parameter in process_strings:
script_running = True
else:
script_running = False
else:
script_running = False
return script_running
此函数是从另一个脚本调用的。 script_name
是调用脚本的名称(带路径),console_logger
是一个 python logging
对象。当我直接从 shell 执行所有操作时,一切正常。该函数打印 ps aux
的输出,看起来像这样(我删除了不必要的其余部分)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
mysql 7225 95.8 1.1 530948 190652 - IJ Sun12 3750:03.47 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/db/mysql/test_jail.err --pid-
user 56261 22.8 0.4 195936 60040 0 S+J 22:14 0:02.74 python3 testscript.py (python3.6)
user 50756 0.6 0.5 220976 78068 - SsJ 21:20 3:25.17 python3 /home/user/immoquery/src/testscript.py (python3.6)
所以你可以看到它永远不会真正 运行 因为当它启动时它总是会检测到自己 运行ning。这是我将来需要解决的另一个问题。但是当我查看 cronjob 创建 ps aux
输出的日志时,它看起来像这样:
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
mysql 7225 92,4 1,3 530948 224528 - IJ So.12 3179:35,23 /usr/local/li
user 80177 24,9 0,4 196016 60184 - SsJ 09:20 0:02,83 python3 /home
user 68285 0,5 7,2 1343792 1198784 - SsJ 07:20 6:46,38 python3 /home
由于无法在 ps aux
的字符串 return 中找到脚本名称,因此检查交付 false
。字符串不知何故被切断了。
这里是 cron 文件的内容:
SHELL=/usr/local/bin/zsh
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
# used to execute immobilienscout24 kaufangebote
#minute hour mday month wday command
20 7,9,11,13,15,17,19,21,23 * * * python3 /home/user/immoquery/src/testscript.py >> /home/user/testscript.log 2>&1
有人知道如何解决这个问题吗?为什么进程输出被切断?是否有虚拟屏幕尺寸或其他相关内容?
您可以通过以下方式保持简单:
0 */2 * * * if ! pgrep -f your-script 2>&1 >/dev/null; then your-script; fi
它的工作方式是通过使用 pgrep
检查进程是否仍在 运行ning,如果不是,它将 运行 您的脚本。
要从 ps
获得完整的命令行,请使用 -ww
(两个 double-us)。 pgrep
是更好的解决方案。
也许更好的方法是使用锁定文件(在本地文件系统上,例如 /var/run
甚至 /tmp
某处)。
我有一个 cronjob,每 2 小时 运行 一个 python 脚本。脚本本身可以 运行 超过 2 小时。这就是我尝试检测脚本是否已经 运行ning 的原因。系统是FreeBSD机器。我尝试使用以下函数进行检测:
def script_already_running(script_name,console_logger,parameter=None):
"""
checks if the script is already running, this is done by syscall and parsing the output. Parameters of the script can be distinguished as well
"""
ps = subprocess.Popen("ps aux", shell=True, stdout=subprocess.PIPE)
process_strings = ps.stdout.read().decode(encoding="utf-8",errors="strict")
ps.stdout.close()
ps.wait()
console_logger.info(process_strings)
# print(process_strings)
# print(script_name)
if script_name in process_strings and parameter is None:
script_running = True
elif script_name in process_strings and parameter is not None:
if parameter in process_strings:
script_running = True
else:
script_running = False
else:
script_running = False
return script_running
此函数是从另一个脚本调用的。 script_name
是调用脚本的名称(带路径),console_logger
是一个 python logging
对象。当我直接从 shell 执行所有操作时,一切正常。该函数打印 ps aux
的输出,看起来像这样(我删除了不必要的其余部分)
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
mysql 7225 95.8 1.1 530948 190652 - IJ Sun12 3750:03.47 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/db/mysql/test_jail.err --pid-
user 56261 22.8 0.4 195936 60040 0 S+J 22:14 0:02.74 python3 testscript.py (python3.6)
user 50756 0.6 0.5 220976 78068 - SsJ 21:20 3:25.17 python3 /home/user/immoquery/src/testscript.py (python3.6)
所以你可以看到它永远不会真正 运行 因为当它启动时它总是会检测到自己 运行ning。这是我将来需要解决的另一个问题。但是当我查看 cronjob 创建 ps aux
输出的日志时,它看起来像这样:
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
mysql 7225 92,4 1,3 530948 224528 - IJ So.12 3179:35,23 /usr/local/li
user 80177 24,9 0,4 196016 60184 - SsJ 09:20 0:02,83 python3 /home
user 68285 0,5 7,2 1343792 1198784 - SsJ 07:20 6:46,38 python3 /home
由于无法在 ps aux
的字符串 return 中找到脚本名称,因此检查交付 false
。字符串不知何故被切断了。
这里是 cron 文件的内容:
SHELL=/usr/local/bin/zsh
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
# used to execute immobilienscout24 kaufangebote
#minute hour mday month wday command
20 7,9,11,13,15,17,19,21,23 * * * python3 /home/user/immoquery/src/testscript.py >> /home/user/testscript.log 2>&1
有人知道如何解决这个问题吗?为什么进程输出被切断?是否有虚拟屏幕尺寸或其他相关内容?
您可以通过以下方式保持简单:
0 */2 * * * if ! pgrep -f your-script 2>&1 >/dev/null; then your-script; fi
它的工作方式是通过使用 pgrep
检查进程是否仍在 运行ning,如果不是,它将 运行 您的脚本。
要从 ps
获得完整的命令行,请使用 -ww
(两个 double-us)。 pgrep
是更好的解决方案。
也许更好的方法是使用锁定文件(在本地文件系统上,例如 /var/run
甚至 /tmp
某处)。